首先在上一篇博客中我已经跟各位举出了几个关于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);
在运行后我们会发现,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指向重绑定 与 函数自执行用法 与 自执行指向,相信你看到这里已经对它有了新的认识。
如果在我的博客文章中有新的收获,麻烦请点一下顶 鼓励一下我
我将会在空余时间为各位分享更多的我所学习到的知识