首页 > 关于js作用域的问题

关于js作用域的问题

var x = 10;    
   var foo = {    
       x: 20,    
       bar: function ()    
       {    
           var x = 30;
           return this.x;    
       }    
   };    
   
   alert(      
     (foo.bar = foo.bar)(),    
     (foo.bar, foo.bar)()    
   ); 

为什么

(foo.bar = foo.bar)()   
(foo.bar, foo.bar)()  

会输出结果10


还是this的问题呀
(foo.bar = foo.bar).bind(foo)()的结果就是正常的20


(foo.bar = foo.bar)() 相当于 var a = foo.bar; a()
(foo.bar, foo.bar)() 相当于 var a = foo.bar; a()

而在非严格模式,a()this 指针 指向 window

同时 全局变量 var x = 10; 也可以通过 window.x 访问到

于是 a() 就变成了 window.x 也就是 10


应该是foo.bar = foo.bar这个赋值操作返回了一个没有调用者的函数,所以这个函数中的this就指向了window。


相当于:

var bar = foo.bar;

alert(bar());

你可以试试看,在foo.bar里打印一下this,看看这个情况下,this指向哪里:

var foo = {    
       x: 20,    
       bar: function ()    
       {    
           var x = 30;
           alert(this === window);//结果是true哦
           return this.x;    
       }    
   };

顺便再说下,你这个例子都是基于非严格模式



foo.bar = foo.bar
foo.bar , foo.bar

我们来认识一下赋值运算(=)

var a
console.log((a = 1)); //  1

说明赋值运算这个表达式是有返回值的,同理foo.bar这里赋值完了返回只是一个Function。最后相对来说是在window这个作用域下面执行了一个Function而已所以this指向是window。

var a = 1,b = 2;
console.log((a,b)); //  2

分号运算符,单纯的看表达式的话它只是返回最后一个值,还是返回Function,最后相对还是在window作用域下运行。

()

组合运算符,用于提升表达执行优先级别
然后送上操作符优先级地址

【热门文章】
【热门文章】