旧方式:
var self = this; setTimeout(function(){ console.log(self); },5000);
用jQuery:
setTimeout($.proxy(function(){ console.log(this); },this),5000);
绑定:
setTimeout((function(){ console.log(this); }).bind(this),5000);
随叫:
setTimeout((function(){ console.log(this); }).call(this),5000);
似乎也适用于:
setTimeout((function(){ console.log(this); }).apply(this),5000);
我想知道这些方法之间是否有明显的区别
@H_403_24@解决方法
对,所以我们有三种调用函数的样式.它们都是解决上下文问题的方法,即根据函数的调用方式,该关键字将具有不同的值.
别名
var self = this; setTimeout(function(){ console.log(self); },5000);
这是一个非常简单的方法.它只是设置一个不会在函数内被覆盖的新变量.该值被关闭,所以当超时后调用函数时,self将是你期望的.
捆绑
setTimeout($.proxy(function(){ console.log(this); },5000); setTimeout((function(){ console.log(this); }).bind(this),5000);
这两个功能具有相同的结果.这是因为$.proxy
与bind
完全一样,bind,但是,这是一种旧的浏览器不支持的新语法.
这通过将上下文永久“绑定”到一个函数.这意味着,但是函数被调用,它的值将永远是第一个绑定参数的值.
调用/应用
setTimeout((function(){ console.log(this); }).call(this),5000); setTimeout((function(){ console.log(this); }).apply(this),5000);
同样,这两个功能是相同的. call
和apply
之间的唯一区别是其他参数发送到一个功能.调用期望一个列表(例如fn.call(context,param1,param2)),而应用程序期望一个数组(fn.apply(context,[param1,param2])).
然而,这些功能都不会做你想要的.他们都使用某个上下文立即调用函数,而不是等待5秒钟.这是因为调用和应用工作就像():代码立即执行.
结论
哪种方法更适合您的任务.对于简单的操作,混叠可能很好地完成这项工作.但是值得记住的是引入另一个变量,并且不能在调用时设置上下文.其他方法在不同情况下也具有优势,特别是在编写用户提供回调函数的库时.
@H_403_24@ @H_403_24@相关文章
事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ "TOC" 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...