我不理解javascript中的一些内容,并将一个示例问题分解为一个基本案例:

a=函数(){b=5;}a.prototype.c=函数(){警报(this.b);}var d=新a();var e=直流电;//如何保存对包含上下文(对象)的方法的引用??d.c();//5->正常e();//未定义->wtf??

那么,为什么在最后一个示例中调用函数时没有上下文?我如何根据上下文来命名它?

提前感谢:-)

3个答案

重置为默认值
6

直流电类似于未绑定的实例方法。你可以使用功能.原型.bind创建绑定到的新函数d日(第一个参数.绑定参数):

var e=直流绑定(d);

或致电e(电子)具有d日作为自变量:

e.call(d);
2

您需要使用对象调用方法以获得正确的上下文。因此:

var e=函数(){return d.c();};

在较新的浏览器中,您可以使用绑定方法执行相同操作:

var e=直流绑定(d);

例如,在jQuery中有代理方法也可以在较旧的浏览器中使用:

var e=$.proxy(d.c,d);
1

这是关于解决值。这可以通过以下方式解决:

myObject.something()//这个东西是我的对象window.something()//这是窗户button.onClick=函数()//这个按钮被点击时是按钮

如何解决这个问题已经给出了,这是一个常见的陷阱,比如在下面的示例中使用setTimeout传递回调

var测试=函数(){var me=这个;//设置对此的引用this.sayAgain=函数(){console.log(“你好,我是”+me.toString());}}test.prototype.toString=函数(){返回“test”;}test.prototype.say=函数(){console.log(“你好,我是”+this.toString());}var t=新测试();setTimeout(t.say,50)//=不引用此的窗口传递函数setTimeout(函数(){t.say();},150);//=测试使用函数传递ref设置超时(t.say再次,200)//=使用我作为保存的此上下文进行测试

第二次超时通过关闭对于setTimeout,如果您计划将say回调传递数百次,但只创建两个测试对象实例,那么最后一个实例(sayAgain)的实现将执行得稍微好一些。

这是因为您在创建测试实例时创建闭包,但在将sayAgain作为回调传递时没有创建闭包然后多次从函数体中删除this.me和this.sayAgain并传递作为结束语。

你可以使用功能.原型.bind但它在IE<8中不受支持,我不确定它是否会像我的示例中使用的那样创建闭包t.say说.

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.