标签:bin function 没有 有一个 cal 多个 ict class 相同
JavaScript里函数的this指向,是一个挺难弄清楚的问题。网上大佬们的总结是:
哪个对象调用函数,函数里面的this就默认指向哪个对象。(注意this指向的只能是对象)
我个人把这句话理解成:看它函数名后加小括号时它的前缀是什么。
为什么说“默认指向”?因为JavaScript给我们提供了几种可以改变函数this指向的方法bind、call和apply。
接下来我们分别举几种常见情况来帮助理解this的默认指向。
如下,函数fn加小括号时它没有前缀,这时对它的调用fn()其实相当于window.fn(),所以this指向的是window。
function fn(){
console.log(this);//window
}
fn();
但是这种情况在严格模式时有些不同
严格模式下,一般函数调用(不是对象的方法调用,也不使用apply/call/bind等修改this),this指向undefined,而不是全局对象。这是严格模式所规定的。
function fo(){
‘use strict‘
console.log(this);//undefined
}
fo();
如下,函数fn的属于对象obj的属性:
var obj = {
a:1,
fn:function(){
console.log(this);
}
}
obj.fn();//obj
可以看到,调用fn时它的前缀是obj,所以它的this指向对象obj。
我们来看一种复杂的:
先声明一个全局作用域下的方法fn,它的功能是输出自己的this,在声明对象obj1和obj2,obj1里声明一个属性fn1,其功能与fn相同,obj2里也声明的属性fn2,除了和fn相同的功能外,fn2还调用了fn和fn1。
function fn(){
console.log(this);
}
var obj1 = {
a: 1,
fn1: function () {
console.log(this);
}
}
var obj2 = {
a: 2,
fn2: function () {
fn();
obj1.fn1();
console.log(this);
}
}
obj2.fn2();
我们在全局下调用fn2,其结果为:
//Window
//Object { a: 1, fn1: fn1() }
//Object { a: 2, fn2: fn2() }
由结果分析:
此时该this指向window( setInterval setTimeout 等)
var timer =null;
timer = setInterval(function(){
console.log(this);
},1000);
箭头函数的this是上一层上下文的this。
箭头函数的this指向在声明函数的时候就固定了,终身不变。
箭头函数时ES6中的内容,本人了解的还不够多,这里就先不赘述了。
call方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向。
语法: 函数名.call(要改变的 this 指向,要给函数传递的参数1,要给函数传递的参数2, ...)
var obj = { name: ‘Jack‘ }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.call(obj, 1, 2)
apply方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向。
语法: 函数名.apply(要改变的 this 指向,[要给函数传递的参数1, 要给函数传递的参数2, ...])
var obj = { name: ‘Jack‘ }
function fn(a, b) {
console.log(this)
console.log(a)
console.log(b)
}
fn(1, 2)
fn.call(obj, [1, 2])
bind方法是把获取到的函数重新封装,返回一个新的函数地址。新地址的this指向改变。
语法:函数.bind(要改变的 this 指向, bind传递的参数1, bind传递参数2, ...);
function fo(a, b){
console.log(this, a, b);
}
var poo = fo.bind( {a : 1} );
console.log(poo)// ? fo(a, b) { console.log(this, a, b); }
bind、call和apply的不同之处:
相同之处:
以上内容全是本人的一点拙见,如有错误,还望各位大佬指正。
标签:bin function 没有 有一个 cal 多个 ict class 相同
原文地址:https://www.cnblogs.com/qncsssznds/p/12549424.html