Javascript在引用函数到变量时等于这个
Javascript that equal this when referencing function to variable
是的,这是另一个关于将this
存储在变量中的问题(that
(,但我对此感到困惑:
function Constructor(){
this.key = 'my key'
};
Constructor.prototype.start = function(){
var that = this;
return (function (){
console.log(that.key)
}());
};
foo = new Constructor;
foo.start()
bar = new Constructor;
newFoo = bar.start
newFoo()
我想既然this
存储为变量,我可以在不丢失范围的情况下传递start()
方法?我知道这已经经常被讨论过,但我找不到适合这种特定情况的答案。
如何在不使用Constructor.apply(this)
的情况下恢复newFoo()
的范围?
谢谢
我想既然它存储为变量,我可以在不丢失范围的情况下传递 start(( 方法?
否,因为您仍在使用 this
的值,就像调用 start
时一样,只是间接使用。您可以在Constructor
中执行此操作:
function Constructor() {
// ...other stuff...
var that = this;
this.start = function(){
console.log(that.key)
};
// ...other stuff...
}
(...并删除您放在原型上的那个(。
现在,您可以随心所欲地传递start
; that
将是调用构造函数时this
具有的值。 start
从调用构造函数到that
变量具有持久引用。
当然,代价是每个通过Constructor
创建的实例都有自己的start
函数副本。大多数现代JavaScript引擎都足够聪明,可以重用函数的代码(但它们需要为每个start
创建单独的函数实例,这只是它们可以重用的幕后实际代码(。
您的另一种选择不是在 Constructor
或 start
内处理此问题,而是在其他地方提供start
的副本时处理它,使用 Function#bind
. Function#bind
是 ECMAScript5 (ES5( 的一个特性,但它可以在较旧的引擎上填充。
例:
// Nice boring constructor with `start` on the prototype
// Note I've made the key an argument; in your code, all of them had the same key
function Constructor(key) {
this.key = key;
}
Constructor.prototype.start = function() {
console.log(this.key);
};
// **********
// Using it
var c1 = new Constructor("c1");
// Use it normally
c1.start(); // "c1" as you'd expect
// Use it forgetting that `this` will change
setTimeout(c1.start, 0); // "undefined" - doh!
// Use it via Function#bind
setTimeout(c1.start.bind(c1), 0); // "c1"
更多(在我的博客上(:
- 闭合并不复杂
相关文章:
- 如何从函数内部的这个变量中获取值
- 为什么这个变量的值没有定义
- 为什么IIFE的这个变量指的是全局范围
- 有人可以解释一下这个变量的声明方式
- 为什么我无法在我的视图中看到这个变量
- 为什么我不能在javascript中访问这个变量
- 为什么 JavaScript 无法读取这个 C# 变量
- 为什么 Angular 没有注意到这个变量的值发生了变化
- Zillow 数据 - json_encode不起作用 - 适用于常规变量
- 为什么这个变量在函数之间传递时会发生变化
- 函数是否像局部变量一样适用于全局变量
- 我应该如何初始化这个变量以与jQuery一起使用
- Angular JS使用controllerAs和这个语法与范围或这个变量
- 为什么这个变量声明语句有效
- 为什么这个变量的值会改变
- Jquery相当于这个
- 为什么这个变量只选择找到的第一个元素
- Javascript Date 适用于临时变量,但在首次分配给变量时失败
- 如何选择具有依赖于 javascript 变量的 id 的行
- 这个变量在这个函数中将如何做: