在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用,就拿最常见的console.log("info…")来说,避免书写冗长的console,直接用log("info…")代替,不假思索的会想到如下语法:
var log = console.log; log("info…");
很遗憾,运行报错:TypeError: Illegal invocation。
为啥呢?对于console.log("info…")而言,log方法在console对象上调用,因此log方法中的this指向console对象;而我们用log变量指向console.log方法,然后直接调用log方法,此时log方法的this指向的是window对象,上下文不一致,当然会报错了。
此时我们可以用bind方法解决这个问题。bind方法允许手动传入一个this,作为当前方法的上下文,然后返回持有上下文的方法,例如:
var log = console.log.bind(console); log("info...");
这样就不会报错了。
但是,bind方法并不支持ie 8以及更低版本的浏览器,我们完全可以自己实现一个,很简单。
Function.prototype.bind = Function.prototype.bind || function(context){ var _this = this; return function(){ _this.apply(context, arguments); }; };
核心通过apply方法实现,闭包的经典应用。_this指向当前方法,context指向当前方法的上下文,二者均通过闭包访问。
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍Javascript中parseInt的正确使用方式,包括了Javascript中parseInt的正确使用方式的使用技巧和注意事项,需要的朋友参考一下 定义和用法 parseInt() 函数可解析一个字符串,并返回一个整数。 语法 parseInt(string, radix) 当参数radix的值为 0,或没有设置该参数时,parseInt()会根据 string来判断数字的基数
问题内容: 我刚刚在我的项目中发现了一些这样的sql查询构建: 这是否达到其目标,即减少内存使用量? 我对此表示怀疑,因为在构造函数中使用了“ +”(字符串concat运算符)。像下面的代码那样,将占用与使用String相同的内存量吗?我了解,使用时有所不同。 两条语句的内存使用量是否相等?请澄清。 提前致谢! 编辑: 顺便说一句, 这不是我的代码 。在一个旧项目中发现它。而且,查询的大小不如我的
我更喜欢后端而不是前端,但是JavaScript引起了我的兴趣。我试图把我的头围绕在我看来是多种不同的建模对象的方法上。 在过去的几年里,我主要是在编写与此类似的代码(假设jQuery已加载): 这样我就可以简单地调用来启用特定的表单,非常类似于PHP中的静态方法调用。 我最近一直在PHP中使用闭包,我知道它们在JavaScript中也存在(我正在使用它们)。我试图更彻底地理解这个概念。在遇到这个
问题内容: 当每个呼叫都取决于之前的呼叫是否已完成时,我试图找到创建异步呼叫的最佳方法。目前,我通过递归调用定义的流程函数来链接方法,如下所示。 这就是我目前正在做的。 然后我将其称为如下 虽然这对我来说非常好,但我不禁认为必须有一种更好(更简单)的方法。以后我的递归调用变得太深时,会发生什么? 注意 :我不是在浏览器中使用javascript,而是在Titanium框架中使用本机,这类似于Nod
问题内容: 我有一个在AWS EC2的Linux上运行的Node.JS应用程序,该应用程序使用fs模块读取HTML模板文件。这是应用程序的当前结构: HTML模板将始终位于该位置,但是,模板读取服务可能会移动到其他位置(更深的子目录等)。在模板读取服务中,我使用fs.readFileSync()加载文件,就像这样: 这将引发以下错误: 我假设这是因为路径“ ./”解析为“ / services /
本文向大家介绍Linux中Homebrew的正确使用方法,包括了Linux中Homebrew的正确使用方法的使用技巧和注意事项,需要的朋友参考一下 很多人都在使用Linux Homebrew ,有三个技巧可以帮助你更好的使用它: 避免环境污染 首先要避免将 Homebrew 的 bin 目录添加到 $PATH ,而仅仅将你需要使用的几个可执行做软连接放到 ~/bin 下面(这个目录在 $PATH