this指向相关

142 阅读2分钟
    window.val = 1;
    var json = {
        val:2,
        dbl:function(){
            this.val = 5;
        }
    }
    var v  = json.dbl.bind(window);              
    v.call(null);   
    console.log(window.val)

结果输出是5,在这里把this指向了window;window下的val是1,但是指行this.val=5后,val被修改成5。

function foo(){
    console.log(11,this)
    setTimeout(function(){
        console.log(this.a);
    })
}
var obj = {
     a:2
};
foo.call(obj);

执行执行语句后我们知道如果在11处打印this那一定是obj;但是在setTimeout异步函数中的this指向是window,所以打印this.a即是window.a=undefined;所以我们只能通过修改this指向或是箭头函数使setTimeout中的this指向obj

window.val = 1;
var json = {
	val:10,
	dbl:function(){
		this.val *= 2;
	}
};
json.dbl();
var dbl = json.dbl;
dbl();
json.dbl.call(window);

console.log(window.val + json.val);

第一步this指向是json结果是20;接下来做一个赋值,并未调用,真正调用时在全局下的dbl(),this指向依旧是window,结果是2,继续执行this依然指向window,变为4,最后输出结果24。

        var val = 1;
        var json = {
            val: 10,
            dbl: function(){
                console.log(91,this)
                val*=2;
                console.log(92,json.val)
            }
        };
        json.dbl();

        console.log(json.val)   
        console.log(val)    
        console.log(json.val + val);  

注意第一个输出是10,而不是20;区别this.val*=2,json.val*=2;这里的val一直是全局的var val = 1;所以结果是2

    var test = (function(i){
        return function(){
            console.log(i*2)
        }
    }(2))
    test(5);

明显闭包问题结果是4

var a = 100;
function test (){
	console.log(a);
	var a = 10;
	console.log(a)
}
test()
var a = 100;
function test(){
	alert(a);
	let a = 10;
	alert(a);
}
test();

undefined 10

报错 (let是不允许变量提升的)

function C1(name) {
	if(name)this.name = name;
}

function C2(name) {
	this.name = name;
}
function C3(name) {
	this.name = name || 'John';
}
C1.prototype.name = 'Tom';
C2.prototype.name = 'Tom';
C3.prototype.name = 'Tom';

console.log(new C1(),new C2(),new C3())
console.log((new C1().name)+ (new C2().name)+ (new C3().name));

var name = "a";
function inner(){
    console.log(name);
    console.log(this.name);
}

function outter(){
    var name = "b";
    inner();
}
outter();

结果输出是a,a;

修改一下:

var name = "a";
function outter(){
    var name = "b";
    function inner(){
        console.log(name,this);
        console.log(this.name);
    }
    inner();
}
outter();

结果为:b,a 闭包中的this的指向是window

function outter(){
    var a = 1;
    function inner(){
        console.log(a);
    }
    return inner;
}
//进行函数调用
var inner = outter();
inner();

依然是考察闭包内部可以访问外部变量,反之则不可以

10.总结分析例证:

    var d = 1;
    function a(){
        function b(){
            d = 3;
            console.log(this,d);
        //     function c(){

        //     }
        //     c()
        }
        b()
    }
    a();
    

闭包中的this一定是指向window的

    var d = 1;
    function a(){
        d=2;
        var d=4;
        console.log(this,d,this.d);
        function b(){
        }
        b()
    }
    a();

执行过程: a定义=> a执行=>全局d声明提升赋值=> 函数b定义=>函数b执行=> 内部变量d声明提升=>内部变量d赋值为2=>内部变量d修改为4 但是this指向始终是window所以结果是1