You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionprocess(data){// do something}{letbigData={};process(bigData);}varbtn=document.getElementById('btn');btn.addEventListener('click',functionclick(e){// do something},false);
回调函数 click 形成了一个覆盖整个作用域的闭包,javascript引擎极有可能在 process 函数执行后还保留着 bigData (?!)。如果使用块级作用域,可以告诉引擎不需要保留 bigData 了
作用域闭包
定义
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
闭包和模块模式运用
varfoo=(functionCoolModule(id){functionchange(){publicAPI.identify=identify2;}functionidentify1(){console.log(id);}functionidentify2(){console.log(id.toUpperCase());}varpublicAPI={change: change,identify: identify1,};returnpublicAPI;})('some string');foo.identify();// some stringfoo.change();foo.identify;// SOME STRING
requireJS原理
varMyModule=(functionManager(){varmodules={};functiondefine(name,deps,impl){for(vari=0;i<deps.length;i++){deps[i]=modules[deps[i]];}modules[name]=impl.apply(impl,deps);}functionget(name){returnmodules[name];}return{define: define,get: get,};})();MyModule.define('bar',[],function(){functionhello(who){return'hello '+who;}return{hello: hello,}});MyModule.define('foo',['bar'],function(bar){functionawesome(){console.log(bar.hello('Rango').toUpperCase());}return{awesome: awesome,}});varfoo=MyModule.get('foo');foo.awesome();// HELLO RANGO
The text was updated successfully, but these errors were encountered:
作用域是什么
var
关键字会导致变量提升的本质:javascript是在运行前极短的时间内被编译的,
var a = 2
实际上是两个动作:编译器会在当前作用域声明变量a(如果之前没被声明过),紧接着运行时引擎在作用域内寻找该变量,如果能找到就对它进行赋值。LHS
和RHS
关于左右侧查询的异常
词法作用域
词法阶段
window.a
的方式访问那些被同名变量遮蔽的全局变量foo.bar.baz
只会查找到foo
,后续会交给对象属性访问规则欺骗词法(eval 和 with)
词法分析阶段基本能够知道全部的标识符在什么位置,从而可以预测以及优化运行时对它们的查找。因此欺骗词法会导致性能问题
函数作用域、块作用域
函数声明与函数表达式
如果function是声明中的第一个词,那么就是一个函数声明,否则是一个函数表达式。它们的区别是函数声明会将函数绑定在所在作用域中,而函数表达式会将函数绑定在自身的函数中。
为什么不推荐匿名函数
arguments.callee
(递归或是事件监听器需要解绑)块级作用域对垃圾回收机制的优化
回调函数
click
形成了一个覆盖整个作用域的闭包,javascript引擎极有可能在process
函数执行后还保留着bigData
(?!)。如果使用块级作用域,可以告诉引擎不需要保留bigData
了作用域闭包
定义
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
闭包和模块模式运用
requireJS原理
The text was updated successfully, but these errors were encountered: