您的位置:首页 > Web前端 > JavaScript

谈谈 JavaScript 中的 this 指向问题

2016-03-25 16:09 1021 查看
JavaScript 中的 this 为一个重难点,它不像静态语言 C#、Java 一样,就表示当前对象。而在 JS 中, this 是运行时确定,而并非定义时就已确定其值。

谈起 this ,必须少不了 JavaScript 另一个重点:函数,在 JS 中函数有以下几种定义方法。

// 函数声明
function fun(){

}

// 函数表达式
var fun=function(){

};

// Function 构造函数
var fun=new Function (arg1, arg2, ... argN, functionBody)  arg1 arg2 .... 为函数形参  functionBody 为函数主体


一 this 指向 window

function  f(){

console.dir(this);
console.dir(this.f===f);
console.dir(this===window)

}

f();

// 此时,可视 f 为 window 对象下定义的一个属性,f() 可视为由 window 进行调用,此时,this 即指向 window




二 this 指向当前对象

var obj={name:"jack",age:20,say:function()
{
console.dir(this);
console.dir(this===obj);
alert(this.name);

}};

obj.say();

// 通过 obj 对象调用 say 方法,而此时 say 方法即指向当前对象




三 this 指向通过构造器函数所创建的对象

var Person=function(name,age)
{
this.Name=name;
this.Age=age;
console.dir(this);

};

new Person("jack",20);

Person("jack",20);

// 前者通过 new 关键词,调用 Person 函数,此时,this 指向当前构造器函数所创建的对象

// 而后者,直接调用 Person 函数,参考第一条,可视为 window.Person(),此时,this 指向 window




四 this 在原型中,指向通过该构造器函数创建的对象(同 new )

var Person=function(name,age)
{
this.Name=name;
this.Age=age;

};

Person.prototype.say=function()
{
console.dir(this);

}

new Person(“jack”,20).say();

// 首选,以 Person 为构造器创建对象,再调用 say 方法,此时,this 指向以该构造器造建的函数对象




最后,看看几个容易引起误解的地方 ,有关该函数中 this 指向,关于以下两个,本人仅仅通过 chrome 控制台及调试,原理性感觉用 Java、C# 的无法解释。

var f={name:'jack',age:20,say:function()
{
console.dir(this);
console.dir(this.name);

}};

var f1=f.say;

f1();

console.dir(window.name);

// 将 f 对象中 say 属性(say 为函数)赋值给 f1 变量,而此时,通过 f1()调用,此时,this 指向 window,并非 f 对象




var f=function()
{
console.dir(this);

var f1=function()
{

console.dir(this);
console.dir(this===f);

};

f1();

};

f();

// 在函数中,再定义一个函数时,同时,在外层函数中调用该函数,而此时 ,this 并非指向外层函数对象,而是指向 window




参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: