function func() {
console.log(this.a);
}
var obj2 = {
a: "1891",
func: func
};
var obj1 = {
a: "coffe",
obj2: obj2
};
//此时的 this 指向 obj2 对象,因为obj2离得近!
obj1.obj2.func(); //>> 1891
function func() {
console.log( this.a );
}
var obj = {
a: "coffe1891",
func: func
};
var bar = obj.func; // 间接引用,见本文【壹.2.3.6】。此时bar和obj.func其实
// 都指向内存中的函数func本身。
var a = "oops, global"; // a 是全局对象window的属性,也是全局变量
bar(); //>> oops, global
// 虽然 bar 是 obj.func 的一个引用,但是实际上,它引用的是func函数本身,
// 因此此时的 bar() 其实是一个不带任何定语的独立函数调用,应用【默认指向】规则,
// 因此函数体内的this指向window,this.a指向window的属性a(全局变量a)
var a = "makai";
function func() {
console.log( this.a );
}
var obj = {
a:"coffe1891"
};
func.call(obj); //>> coffe1891
// 在调用 func 时强制把它的 this 绑定到 obj 上
var num = 0;
class Obj {
constructor(num){
this.num = num;
}
func(){
console.log(this.num);
}
func1(){
setTimeout(function () {
console.log("setTimeout:"+this.num);
}.bind(this), 1000);//bind
}
func2(){
setInterval(function () {
console.log(this.num);
}.bind(this), 2000);//bind
}
}
var obj = new Obj(1);
obj.func();//>> 1 输出的是obj.num
obj.func1()//>> setTimeout:1 输出的是obj.num
obj.func2()//>> 1 1 1 1 …… 输出的是obj.num
function func(a) {
this.a = a;
}
var bar = new func("coffe1891");
console.log(bar.a); //>> coffe1891
// 使用new 来调用func(..)时,我们会构造一个新对象并把它绑定到func(..)调用中的this上
function func(name) {
this.name = name;
this.getName = function() {
return this.name;
};
}
var obj = new func("coffe"); //this会指向obj
console.log(obj.getName()); //>> coffe
var obj1 = {
name: "coffe"
};
function func() {
return this.name; //这里的this本来指向window
}
var str = func.call(obj1); //改变了func函数里面this的指向,指向obj1
console.log(str); //>> coffe