Call / Appy均会应用到object上面一个函数上,只是apply传参数是以数组传的
在class里面如果是有返回值的时候,就是返回值;但是没有的话,会是默认这个class本身,即this
this在函数对象里面会成为object的代称;如果在独立的函数里面,则仅仅是指向Global和windows
this在函数对象里面会成为object的代称;如果在独立的函数里面,则仅仅是指向Global和windows
Node.js里面this是指向的global对象
this指向:
1、直接调用函数(<function>()):this指向全局对象。
2、方法调用模式(<object>.<function>()):this指向调用者<object>。
3、构造函数调用模式(obj = new <function>()):this指向被构造者obj。
4、apply/call/bind方法:this指向方法的第一个参数。
5、严格模式下,this不允许指向全局对象,此时this值为undefined。
上面就是对this的介绍,还有一个内容是bind,是传入对象的一个call(类似吧),这个不太懂所以没写
bind的作用大于"对象内方法隐式绑定对象this"的作用
这里传入7 返回了[object Number]! => 对啊 因为会把基础类型转换为对象类型(之前有讲过)
如果函数的返回值不是对象类型 或者没写返回值 那么new 一个函数会将this绑定到new出来的对象身上(this == new出来的对象)
如果返回值是对象类型 那对象类型的首地址即时新对象的地址(ok 我就用C的概念)
对象原型链([[proto]])上的this.a 竟然取到了对象的属性a (哦 因为this是动态作用域)
严格模式下 函数内的this默认是undefined
call和apply方法可改变this的指向
构造器中的this
对象原型链上的this
作为对象方法的函数的this
call/apply方法
add.call(o,5,7) // o作为this 5赋值给参数c 7赋值给参数d
所以add.call(o,5,7)=this.a+this.b+c+d=1+3+5+7=16
apply和call的区别在于传参的不同,call的参数扁平化,apply的参数以数组的形式传递
add.apply(o,[10,20]) //o作为this 10赋值给参数c 20赋值给参数d
所以add.apply(o,[10,20])=this.a+this.b+c+d=1+3+10+20=34
通过构造器创建对象o,此时this指向的是MyClass.prototype的一个空对象,调用o.a,返回的是MyClass.prototype.a,又因为MyClass中没有return,默认return的是this,即o.a=this.a=37
同样的因为C2中有返回值return(对象a),那么调用o.a时相当于对象a中a属性,o.a=38
对象o中有个属性f,f是一个函数,那么这个函数f就是对象o的对象方法;
通过Object.create()创建了对象p,此时对象p原型会指向对象o;
对对象p上创建两个属性a和b,其值分别为1和4;
此时通过p.f()调用时,调用的是p原型上对象o的对象方法,此处this指向的是对象p(this.a=p.a,this.b=p.b)
若函数作为对象的属性(即对象方法),作为对象方法去调用(o.f())时,此时this指向的是对象o;
若直接调用independent(),此时this指向的是window。但若通过o.f()作为对象方法去调用,this指向的又是对象o
一般函数的this在浏览器指向的是window。直接调用f1(),返回是this指向的就是window;但若在严格模式下,直接调用f2()返回的this会指向undefined
全局作用域的this在浏览器指向的window。
例如:this.document===window.document //true
this.a=37 相当于 window.a=37
o.g(); {a:'test'}.f(); 返回对象{a:'test'}中的属性a的值 即test
return 基本类型; 会将this作为返回值
return对象; 会将对象作为返回值,所以下面的a输出为38
严格模式this->undefined
-------
函数中的this:函数作为方法被对象调用,则this指向调用它的对象。
最外层声明的函数里的this指向window,严格模式下undefined
原型链上函数this指向外面的对象
bind this
call apply 修改this