Function.prototype.call()中'this'的范围如何变化?

时间:2016-08-28 22:01:33

标签: javascript

我在下面有这个示例代码。我可能偏离基础,但我总是在javascript中理解this来表示作为调用对象的函数/对象的所有者。

function hello() {
  var hello = [this.name, this.sayHello].join('');
  console.log(hello);
}

var obj = {
  name: 'Chris', 
  sayHello: ', how are you today?'
};

hello.call(obj);

我的下一个想法是正在发生的事情是obj现在正在接收其原型的hello()函数。所以我然后在.call函数之后运行它。

obj.hello();

令我惊讶的是我收到了一个类型错误:你好不是一个函数。任何人都可以对这个.call() javascript函数的后端发生的事情有所了解吗?

修改 让我编辑清楚。 我问的问题是“'这个'的范围是如何变化的?函数hello()在范围内不应该有this.name。除非将函数hello添加到obj的原型中但它显然有效。所以在.call()的Javascript函数端发生了什么诡计让它发挥作用。

3 个答案:

答案 0 :(得分:2)

Function#call执行this绑定到thisArg的函数。

您可以实现类似的功能:

Function.prototype.myCall = function(thisArg) {
  thisArg.myBoundCall = this;
  thisArg.myBoundCall();
  delete thisArg.myBoundCall;
}

function hello() {
  var hello = [this.name, this.sayHello].join('');
  console.log(hello);
}

var obj = {
  name: 'Chris',
  sayHello: ', how are you today?'
};

hello.myCall(obj);

答案 1 :(得分:1)

通过执行hello.call(obj);,它不会在名为hello的obj对象上创建一个新方法,以便稍后使用。

答案 2 :(得分:0)

nullthis中指定的对象。您可以通过其他方式将hello.call定义为hello的方法。

this