javascript —— this

目录

为什么要讨论this

 代码一:

function fun1(){
    var aa = 'I am aa';
    console.log(this.aa)
}
fun1();

会打印出什么呢?是 ' I am aa ' 吗,

结果是:

undefined

原因:

此时 this 指向 window 对象,

this.aa 等同于 window.aa

aa 是局部变量,aa 变量声明提前到全局,但是赋值是在函数里面,该值只在函数内部有效,

window.aa 访问不到函数内部的值,因此会打印 undefined

 代码二:

var fun2 = function(){
    console.log(this.name);
}

var name = 'I am x - global';

var obj2 = {
    name: 'I am x - local',
    ff: fun2
}

fun2();
obj2.ff();

结果是:

I am x - global
I am x - local

fun2() 等同于 window.fun2() ,直接调用函数,此时所处 this 指向 window

obj2.ff() 通过 obj2 对象访问其方法,这时 this 指向 obj2

代码三:

var fun2 = function(){
            console.log(this.name);
        }

        var name = 'I am x - global';

        var obj2 = {
            name: 'I am x - local',
            ff: fun2,
            ff2: function(){
                function fun3(){
                    console.log(this.name)
                }
                fun3();
            }
        }

        fun2();            // global
        obj2.ff();        // local
        obj2.ff2();        // 

结果:

I am x - global
I am x - local
I am x - global

就如下面定义所说的,

this 指向包含它的函数作为方法被调用时所属的对象。

此时 fun3 为函数,并非为绑定到对象上的方法。

this是什么

定义:this是指包含它的函数作为方法被调用时所属的对象。

我的理解:别调用时所处的上下文。

如何改变this的指向

  • call()
  • apply()

看一段代码

var name = "global name";
var obj1 = {
    name: 'obj1'
}
var obj2 = {
    name: 'obj2'
}
function myName(){
    console.log(this.name);
}

myName()
myName.call(obj1)
myName.call(obj2)

结果:

global name
obj1
obj2

call 改变了 this 的指向

callapply 的区别

接受参数方式不同

Object.call(obj, arg1, arg2, arg3)

Object.apply(obj, [arg1, arg2, arg3])

猜你喜欢

转载自www.cnblogs.com/mu159/p/11290073.html