资源描述:
《javascript必知必会(九)function说起闭包问题_javascript技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaScript必知必会(九)function说起闭包问题function函数格式functiongetPrototyNames(o,AoptionalVa){a二a
2、
3、[];for(varpino){a.push(p);}returna;}callerfunc.caller返冋函数调用者functioncal1func(){if(callfunc.caller){alert(callfunc.caller.toString());}else{alertC没冇函数调用〃);}}functionhandleCaller(){c
4、allfunc();}handleCaller();//返冋handlercallfunc();//没有函数调用,返回null,执行了《没有函数调用》callee匿名方法递归调用alert((function(x){if(x〈二)return;returnx*arguments.cal1ee(x-);}()));//scope作用域大家都不陌生,今天就来说说闭包问题,深刻吃透闭包问题。1、:定义的全局变量也能在函数内部访问。当定义的局部变量和全局变量名字和同时,局部变量的就会隐藏全局变量,不会破坏全局变量的值。varscope二"globalscope";functionf(){varscope=/zlocalscope";returnscope;}alert(f());//localscopealert(scope);//globalscope;上面确实是很容易理解,对吧。2、全局变量可以不用
6、var声明,但是局部变量必须使用var声明,如果局部变量不使用var声明,编译器会默认这个是个全局变量。scope二"globalscope";functionf()scope="localscope";returnscope;}alert(f());//localscopealert(sco
7、pe);//Iocalscope但是全局变量不使用VH声明,也仅限非严格模式,如果使用严格模式的话,会报错谋」iiie丄i丄:Console0▼」PreservelogOUncsught^eferenceErrcr:scopeis
8、norcefined所以建议大家声明变量时,千万不要省略可以避免不必要的麻烦。3、声明提前,也是可以滴。什么叫什么捉前。{}Line17rColumn1Console0▼_JPreservelogundefinedglobalscope这个可能大家看出第一个打印undefined,是呀述没有给他赋值,下而赋值可定打E卩g
9、lobalscope了。这样理解并没有错,但是为什么会这样的呢,一个变量不是应该先定义才可以使用的吗?这里给大家说下作用域链,JavaScript是基于词法作用域的语言。1、作用域链是一个对象或者链表,这组代码小定义了这段代码〃作用域小“的变量。当JavaScript需要查找变量scope时,就会从链中的第一个对象开发查找,如果第一个对象为scope,则会直接返回这个对象的值,如果不存在继续第二对象开始查找,一直到找到。如果在作用域链上未查到该变量,则会抛岀一个错误。我们口J以这个作用链口J以这样表示:查找scope-〉wind
10、ow(全局对象)很显然后面是有定义scope的。但是并没有做赋值操作,后面才做赋值操作,所以此时值为undefined・4、这个比较具有迷惑性了,大家猜想下打卬的值是什么?