关于this指向问题.

吾曾今愛看武俠劇
  • 901
function identify() {
    return this.name.toUpperCase();
}

function sayHello() {
    var greeting = "Hello, I'm " + identify.call( this );//不太理解这一步是把this绑定到sayHello函数中嘛?
    console.log( greeting );
}
回复
阅读 1.9k
5 个回答
toBeTheLight
  • 16.6k
✓ 已被采纳

不是呀,是把sayHello内的this绑定给identify。
例如

var a = {name: 'test'}
sayHello.call(a)
// sayHello的this是a,然后又把a作为this绑定给了identify
identify.call( this );

是把当前的上下文环境this传给identify函数,至于你这个this指向哪里,没运行无法判断,
如果你是直接运行函数

sayHello();

那this指向window环境

如果你是用new 调用

var obj = new sayHello();

那这个this指向obj对象

call是改变identify的this指向,具体指到谁,还要看你的sayHello方法是怎么被调用,被谁调用的,调用的时候用没用call、apply方法。

海洋饼干
  • 1.5k

首先,不是,是将this绑定到identify函数上,然后identify函数再对this处理,但这个this到底是什么要看你如何调用函数sayHello了,比如

function identify() {
    return this.name.toUpperCase();
}

function sayHello() {
    var greeting = "Hello, I'm " + identify.call( this );
    console.log( greeting );
}
var obj = { name : "hybg" , sayHello : sayHello };
obj.sayHello();  // Hello, I'm HYBG

window.name = "window";
sayHello();      //Hello, I'm WINDOW

第一种的this指向obj ( 隐式绑定 ),第二种指向window ( 默认绑定 ),
this指向什么,完全取决于 什么地方以什么方式调用,而不是 创建时this在哪。

更多的绑定方式和源码解析,可以戳这里js this绑定,如果是不清楚call,apply的工作原理刚刚的链接也详细介绍了。( 逃

宣传栏