Genzhen

Results 68 comments of Genzhen

**答案** 5 Error, a is not defined **解析** 在这个立即执行函数表达式(IIFE)中包括两个赋值操作,其中`a`使用`var`关键字进行声明,因此其属于函数内部的局部变量(仅存在于函数中),相反,`b`被分配到全局命名空间。 另一个需要注意的是,这里没有在函数内部使用[严格模式](http://cjihrig.com/blog/javascripts-strict-mode-and-why-you-should-use-it/)(`use strict`;)。如果启用了严格模式,代码会在输出 b 时报错`Uncaught ReferenceError: b is not defined`,需要记住的是,严格模式要求你显式的引用全局作用域。因此,你需要写成: ```js (function () { "use strict"; var a = (window.b = 5);...

> 这里并不是因为赋值给 f ,相当于f(),所以this指向window的。 > 不然试试下面代码也会打印 undefined > > ```js > var foo = { > bar: function(){ > return this.baz; > }, > baz:1 > } > console.log(typeof (foo.bar=foo.bar)());...

1)Chrome 浏览器提供 4 种发布版本,即稳定版(Stable)、测试版(Beta)、开发者版(Dev)和金丝雀版(Canary)。 虽然 Chrome 这几个版本名称各不相同,但都沿用了相同的版本号,只是更新早晚的区别。就好比 iOS 等系统,Beta 版可以率先更新到 iOS 12 并进行测试,不断改进稳定后,正式版才升级到 12 版本。 Chrome 也是如此,更新最快的 Canary 会领先正式版 1-2 个版本。 - 1.Canary(金丝雀) 版 - 只限用于测试,Canary 是 Chrome 的未来版本,是功能、代码最先进的Chrome 版本,一方面软件本身没有足够时间测试,另一方面网页也不一定支持这些全新的功能,因此极不稳定。好在,谷歌将其设定为可独立安装、与其他版本的...

> 这种题目没有代表性,建议删掉吧 @cool-518 是没什么代表性,但是知识扩展还是有必要的,就当多了解一些知识了

1)防抖 - 原理:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 - 适用场景: - 按钮提交场景:防止多次提交按钮,只执行最后提交的一次 - 搜索框联想场景:防止联想发送请求,只发送最后一次输入 - 简易版实现 ```js function debounce(func, wait) { let timeout; return function () { const context = this; const args = arguments;...

```js /** 防抖: * 应用场景:当用户进行了某个行为(例如点击)之后。不希望每次行为都会触发方法,而是行为做出后,一段时间内没有再次重复行为, * 才给用户响应 * 实现原理 : 每次触发事件时设置一个延时调用方法,并且取消之前的延时调用方法。(每次触发事件时都取消之前的延时调用方法) * @params fun 传入的防抖函数(callback) delay 等待时间 * */ const debounce = (fun, delay = 500) => { let timer...

React并不是将click事件绑在该div的真实DOM上,而是在document处监听所有支持的事件,当事件发生并冒泡至document处时,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅减少了内存消耗,还能在组件挂载销毁时统一订阅和移除事件。 另外冒泡到 document 上的事件也不是原生浏览器事件,而是 React 自己实现的合成事件(SyntheticEvent)。因此我们如果不想要事件冒泡的话,调用 event.stopPropagation 是无效的,而应该调用 event.preventDefault。 ![react事件绑定原理](http://img-static.yidengxuetang.com/wxapp/issue-img/qid-17.png)

**1)事件注册** ![事件注册流程](http://img-static.yidengxuetang.com/wxapp/issue-img/qid-17-eventsign.png) - 组件装载 / 更新。 - 通过lastProps、nextProps判断是否新增、删除事件分别调用事件注册、卸载方法。 - 调用EventPluginHub的enqueuePutListener进行事件存储 - 获取document对象。 - 根据事件名称(如onClick、onCaptureClick)判断是进行冒泡还是捕获。 - 判断是否存在addEventListener方法,否则使用attachEvent(兼容IE)。 - 给document注册原生事件回调为dispatchEvent(统一的事件分发机制)。 **2)事件存储** ![事件存储](http://img-static.yidengxuetang.com/wxapp/issue-img/qid-17-event-store.png) - EventPluginHub负责管理React合成事件的callback,它将callback存储在listenerBank中,另外还存储了负责合成事件的Plugin。 - EventPluginHub的putListener方法是向存储容器中增加一个listener。 - 获取绑定事件的元素的唯一标识key。 - 将callback根据事件类型,元素的唯一标识key存储在listenerBank中。 - listenerBank的结构是:listenerBank[registrationName][key]。...

考点:函数柯里化 函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。 1)粗暴版 ```js function add (a) { return function (b) { return function (c) { return a + b + c; } } } console.log(add(1)(2)(3)); // 6 ```...