浅谈javaScript的 this指向重绑定 与 函数自执行用法 与 自执行指向

首先在上一篇博客中我已经跟各位举出了几个关于js的作用域与一些配合this关键字的例子。

今天我想给各位首先说说关于this指向问题。首先我们有以下一个匿名函数可以先运行一下:

function Fn(){
	console.log(this);
}
Fn();

运行之后,我们可以在控制台得到,这个this指向的是window对象,而当我们如果要进行具体的元素绑定时

需要将this关键字指向我们的元素对象时,我们该如何操作呢?

接下去,我将为大家介绍一下call bind apply三种绑定的区别与用法。

<body>
   <div id="box"></div>
  <script>........</script>
</body>

我们在html页面的body中加入一个div标签   (以下代码均为javaScript代码)

我们要在进行对象操作时,首先就是获取到元素对象


var oBox=document.getElementById("box");
oBox.a=10;


我们抓取了id为box的对象,并给他创建了一个名为a的自定义属性,值为10

在完成了以上对象抓取与自定义属性设置后,我们首先来说说call吧,call命令是我使用过程中最常用到的绑定命令,他的参数格式比较简单易懂。

首先我们来说说无参匿名函数的call绑定。

(function(){
    alert(this.a);
}).call(oBox);


我们定义了一个匿名函数后使用括号将函数包围,使用 function.call(newObj) 的方式来重新绑定this指向。

在运行后我们会发现,call命令在重绑定对象的同时,还使我们的匿名函数执行了一次。


随后我们将这个函数稍作改动,为它添加几个形参。请注意变化:

(function Fn(a,b){
    this.a=a;
    this.b=b;
}).call(oBox,10,20);
console.log(oBox.a,oBox.b);

那么如上所示 也就是call命令的有参函数call绑定的方式了。

经测试,在重绑定执行函数后,oBox的确拥有了b的自定义属性。


我们可以总结一下写法就是  function.call(newObj,arg1,arg2,arg3,.....);


以上为call的用法,在理解了call之后,apply会非常简单,因为他们非常相像,只有一个区别,就在有参函数的绑定上。

(function Fn(a,b){
    this.a=a;
    this.b=b;
}).apply(oBox,[10,20]);
console.log(oBox.a,oBox.b);

请注意看如上的apply用法。apply可以使用的参数至多只可以有2个,而第一个参数为newObj,第二个参数为函数的参数组(我们需要将他们打包成数组传入)


值得注意的是,使用call与apply会使函数执行一次,这个是需要注意的地方。


那有人会问,如果我们想重绑定,又不想让它马上执行,那我们该怎么做呢?那么,接下去有请最后一个绑定命令 bind

我们将上边的Fn函数再次修改一下如下所示:

function() Fn(a,b){
    this.a=a;
    this.b=b;
}

他是一个再常规不过的函数了,而他与bind的配合,可能可以省下不少代码量。

因为bind命令不会使函数执行一次,所以我们需要申明一个变量来存储新的函数对象。

var oBoxFn=Fn.bind(oBox);
console.log(oBoxFn,oBox.b);

我们通过控制台可以查看到,使用bind绑定后的新的函数内容与Fn是完全一样的,而oBox.b在这一次打印是undefined,这正证明了bind绑定并不会使函数执行一次。

那像我们这样的有参函数Fn在使用了bind重绑定后如何使用参数去执行函数呢,正确的用法如下所示:

oBoxFn(3,4);
console.log(oBox.a,oBox.b);

既然oBoxFn的函数内容与Fn完全一致,我们就可以完全使用以上的写法去使用参数调用函数了。通过打印我们可以发现是完全可以的。



好,总结一下上边的内容,我们可以得出以下结论:

function.call(newObj,arg1,arg2,arg3,arg4,......,argn)         call命令可以接收多个参数,并会以newObj为对象执行一次函数



function.apply(newObj,[arg1,arg2,arg3,arg4,......,argn])   apply命令可以至多接收2个参数,并会以newObj为对象执行一次函数



function a(){....};

var b=a.bind(newObj);

b(arg1,arg2,arg3,arg4,.....,argn);                                         bind命令需要一个新的变量去存储,而且与call和apply不同,它不会自动执行函数




好,this指向的绑定我想各位讲到这已经了解的非常透彻了。接下去,在很多情况下,我们会遇到以下情况:

Function Fn(){
    ...
    ....
    .....
    ......
}
Fn();

那我们有没有什么方法可以不多写一个Fn();呢,答案是可以的。我总结了以下几条,可以使函数既成功定义,又自执行的表达式,我就不一一讲解了。

具体写法如下:


!function(){..........}();

~function(){..........}();

+function(){..........}();

-function(){..........}();

(function(){..........})();

需要注意的是,以上函数自执行的this指向都是window。



好了,以上也就是javaScript的 this指向重绑定 与 函数自执行用法 与 自执行指向,相信你看到这里已经对它有了新的认识。


如果在我的博客文章中有新的收获,麻烦请点一下顶 鼓励一下我

我将会在空余时间为各位分享更多的我所学习到的知识


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值