this
它总是返回一个对象。
简单说,this
就是属性或方法“当前”所在的对象。
var person={
name:'张三',
describe:function(){
return "姓名:"+this.name
//this.name this表示name属性所在的那个对象。函数也是一种对象,但this不指向函数,指向函数所在的对象
}
};
console.log(person.describe()); //姓名:张三 person.name
函数也是一种对象,但this不指向函数,指向函数所在的对象
改变this指向
由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的。
var person={
name:'张三',
describe:function(){
return "姓名:"+this.name
}
};
var B={
name:'李四'
}
B.describe=person.describe;
console.log(B);//{ describe:function(){return "姓名:"+this.name }
console.log(B.describe());//姓名:李四
使用场合
this使用主要找调用this的方法的当前对象
this
主要有以下几个使用场合。
(1)全局环境
全局环境使用this
,它指的就是顶层对象window
。
上面代码说明,不管是不是在函数内部,只要是在全局环境下运行,this
就是指顶层对象window
。
this==window //true
function f() {
console.log(this===window);
}
f() //true
(2)构造函数
构造函数中this 指向实例对象
var Obj = function (p) {
this.p = p;
};
var o = new Obj('Hello World!');
//o.p : 'Hello World!'
(3)对象的方法
var obj ={
foo: function () {
console.log(this);
}
};
//obj.foo() 输出 foo: function () {console.log(this);}
绑定this方法
作用域:
JS中的作用域是一个存储变量、函数以及对象的位置,每个变量、函数和对象都被存储在一个特定的作用域中,它是指变量和函数在代码中的可访问范围,作用域决定了代码中哪些部分可以访问特定的变量和函数,通过作用域,我们可以将变量和函数封装在不同的作用域中,使其在合适的范围内可访问
call()
函数实例的call
方法,可以指定函数内部this
的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。
var obj = {};
var f = function () {
return this;
};
f() === window // true
f.call(obj) === obj // true 函数call方法,可以修改函数中this指向
var objA={a:1};
console.log(f.call(objA)===objA);//true
//说明 函数实例的call方法,可以指定函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。
面代码中,全局环境运行函数f
时,this
指向全局环境(浏览器为window
对象);call
方法可以改变this
的指向,指定this
指向对象obj
由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,**this
**就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。