this的作用域问题

function Card(num,suit){

this.num = num;
this.suit = suit;

}
这里的this指向什么呢,最好举个例子

阅读 3.4k
7 个回答

this的指向不是在声明的时候确定的而是在调用的时候被定义的有这么几种情况

1. 普通函数调用,this为全局对象或是undefined
2. 作为对象的方法,this为那个对象
3. new 表达式,this为以该函数为原型的新创建的对象
4. 使用 apply/call指定 this
5. 用bind绑定固定的this
6. 事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)

看你怎么用,this只有在你使用的时候才能确定其指向

function Card(num,suit){
  this.num = num;
  this.suit = suit;
}

创建对象

var obj=new Vard(1,2)

this指向一个以Card.prototype为原型的空对象

Card(1,2)

this指向 window对象

var obj={}
Card.call(obj,2,3)

this指向obj对象

var a = new Card(1,2);
a.num ; // 1
a.suit ;// 2

this指向你new出来的a

这里的 this 指向执行时所在的对象

比如,立即函数:

Card(2, 3)

这里的 this 指向 window,(非严格模式),

再比如,如果是对象的方法,

var obj = {};
obj.card = Card;
obj.card();

这个时候 this 指向 obj 啦。

call apply 还能指定 this 的指向。

所以要函数执行的时候,才能得知 this 的指向。

以上的都说的差不多了,我再补充一个ES6中箭头函数的this指向:

    let person = {
    name: "galler",
    speak: ()=> {
            console.log(this);//window
            console.log(this.name); //""
        }
    };
person.speak();

函数本身是没有this的,只能向外找this继承,找到后发现this指向window(浏览器环境),而window下没有name属性,所以this.name = ""(空)

新手上路,请多包涵

《javascript高级程序设计》中有说到:this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象调用时,this等于那个对象。不过,匿名函数具有全局性,因此this对象同常指向window

不过针对于匿名函数this具有全局性的观点仍是有争议的,具体this作用域问题可参考
【Javascript】深入理解this作用域问题以及new运算符对this作用域的影响

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题