锁定老帖子 主题:关于js作用域的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-01-02
楼主看看,某大牛写的《javascript core》吧,局部作用域链和其他的,书里说的很清楚
|
|
返回顶楼 | |
发表时间:2012-01-03
黑白两相望 写道 var name = "abc"; // js会有一个预解析的过程,先执行函数里的变量声明,但不执行赋值 function testGlobal() { // 所以这里查找变量的时候,搜索到函数里的name // 此时有name的声明,就是下面那个,但是并没有执行赋值 // 所以是undefined alert(name); //2处:undefined var name = "def"; // 这里调用这个函数的时候,上面的赋值语句已经执行 // 所以是def alert(name); //3处:def // this - 谁调用指向谁 // js里方法和对象是松散的耦合 // 多数情况下函数可以随意得绑定到别的对象上去运行 alert(this.name); //4处:abc this. name = "ghi"; alert(this.name); //5处:ghi } // 搜索变量找到全局作用域的 name alert(name); //1处:abc // window直接调用这个方法 testGlobal(); // 函数里this. name = "ghi"; 经过上面的函数执行实际是window.name='ghi'; alert(name); //6处:ghi 讲的太好了,清楚,明白,易懂。。。受教。。。 |
|
返回顶楼 | |
发表时间:2012-01-04
waitingmyself 写道 楼主说的有问题吧 2处应该是 abc
是你错了。楼主说的没错,2处确实是underfind,因为下面有一个又定义了一次name。程序在执行的时候,会先执行var name,然后再执行name="def",所以这个时候alert(name)的时候它是underfind的。 |
|
返回顶楼 | |
发表时间:2012-01-04
学到了,受教
|
|
返回顶楼 | |
发表时间:2012-01-04
最后修改:2012-01-04
黑白两相望 写道 var name = "abc"; // js会有一个预解析的过程,先执行函数里的变量声明,但不执行赋值 function testGlobal() { // 所以这里查找变量的时候,搜索到函数里的name // 此时有name的声明,就是下面那个,但是并没有执行赋值 // 所以是undefined alert(name); //2处:undefined var name = "def"; // 这里调用这个函数的时候,上面的赋值语句已经执行 // 所以是def alert(name); //3处:def // this - 谁调用指向谁 // js里方法和对象是松散的耦合 // 多数情况下函数可以随意得绑定到别的对象上去运行 alert(this.name); //4处:abc this. name = "ghi"; alert(this.name); //5处:ghi } // 搜索变量找到全局作用域的 name alert(name); //1处:abc // window直接调用这个方法 testGlobal(); // 函数里this. name = "ghi"; 经过上面的函数执行实际是window.name='ghi'; alert(name); //6处:ghi 这两天放假没时间上论坛,非常感谢黑白两相望这位大牛,学习了! 同时也感谢其他的各位大大们! |
|
返回顶楼 | |
发表时间:2012-01-05
jefbx 写道 你写的testGlobal(); 相当于window.testGlobal() 所以this为window; 1处的就不解释了; 2处的原因在于你在testGlobal里面应用了 var name 这样name就是局部变量,覆盖了全局的name, js在函数执行前会扫描局部变量,相当于在函数的最开头写了一个var name, 所以执行到2处时,name虽然声明了,但没有赋值,就是undefined了,当执行到3处时,name已经被赋值了;4处的name是全局的name;6处的原因在于testGlobal函数修改了全局的name变量(this.name, this即window, 全局变量都是window的属性),
正解 |
|
返回顶楼 | |
发表时间:2012-01-05
<SCRIPT LANGUAGE="JavaScript"> <!-- var name = "abc"; function testGlobal(){ this.name = "123"; return this; } alert(testGlobal().name); alert(new testGlobal().name); //--> </SCRIPT> 这里的在直接调用testGlobal()中的this 和 new Global()中得this,有什么不同,编译器怎么解析的?求大牛解惑 |
|
返回顶楼 | |
发表时间:2012-01-05
weilingfeng98 写道 <SCRIPT LANGUAGE="JavaScript"> <!-- var name = "abc"; function testGlobal(){ this.name = "123"; return this; } alert(testGlobal().name); alert(new testGlobal().name); //--> </SCRIPT> 这里的在直接调用testGlobal()中的this 和 new Global()中得this,有什么不同,编译器怎么解析的?求大牛解惑 直接调用 this指的是调用者 这里是window。 new 在function中会先创建一个对象,然后this指向新创建的对象,然后执行function的内容,最后返回创建的对象。 |
|
返回顶楼 | |
发表时间:2012-01-08
如果函数里面有变量和全局变量同名
js认为这个变量在函数里 所有2处是undefined |
|
返回顶楼 | |
发表时间:2012-01-09
搞不清楚你是做研究还是做项目。
如果是做项目,我只能说你名字不好好取,干嘛非得要取一样的变量名? 为了显示你的功力深厚么?做项目的代码要写的简单易懂,你要保证后续维护人员能轻易看懂,也要保证以后的你能看懂。 |
|
返回顶楼 | |