让人崩溃的几个小例子

来源:互联网 发布:欧树怎么样知乎 编辑:程序博客网 时间:2024/05/01 15:42
var aa = function(){   this.b=1;   this.c = function(){       alert(this.b);   };};var a = new aa();function abc(func){    func();}abc(a.c);

这里很明显是undefined,这里的this指向的是window.

var aa = function(){   this.b=1;   this.c = function(){       alert(this.b);   };};var a = new aa();function abc(func){    func();}abc(function(){a.c();});

这里是1,应该是匿名函数块保存了上下文运行环境。

var aa = function(){   this.b=1;   this.c = function(){       alert(this.b);   };};var a = new aa();function abc(func){    alert(this.b);    func();}abc.call(a,a.c);

我最开始愚蠢的写法,认为能改变this,这里只能改变abc函数的运行上下文环境为a,但是到func()时,还是会变为window,这里就相当于var func = a.c;func的定义环境在window,所以会指向window。

例如:

var aa = function(){   this.b=1;   this.c = function(){       alert(this.b);   };};var a = new aa();var bb = {  b:2,  c:function(){  alert(this.b);     func();  }}var func = a.c;bb.c();

这里赋值的时候,就把运行上下文带到了window

var aa = function(){   this.b=1;   this.c = function(){       alert(this.b);   };};var a = new aa();function abc(func){    func.call(a);}abc(a.c);

改变运行上下文的正确写法。


还是总结下:传参传函数时能通过function(){func()}能保存到上下文不改变,如果传参传成func的话,要改变上下文环境,不能在调用该参数的函数时改变,而是在该参数被使用的地方改变上下文路径。

原创粉丝点击