博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 函数引用的疑问
阅读量:4294 次
发布时间:2019-05-27

本文共 948 字,大约阅读时间需要 3 分钟。

>> var a = function(){return 1}undefined>> var b = aundefined>> b()1>> var c = document.getElementByIdundefined>> c('a')TypeError: Illegal invocation

在上面这段代码中,变量b成功地引用了函数a,但是变量c却不能成功应用内置函数document.getElementById,我感到很疑惑

>> var c = documentundefined>> c.getElementById('a')null
我猜测是JavaScript禁止重命名内置函数,但是为什么重命名内置对象(上段代码)是可以的呢?

后来上网找资料发现原来是命名空间的问题,getElementById是document对象的方法,而c则是window的成员,按下面的写法可以获得正确的结果

>> document.d = document.getElementById>> document.d('wrap')
...

附:在Python中不存在这样的问题

>>> class a:	def b(self):		print 'a.b'		>>> c=a().b>>> c()a.b>>>

2016.10.21 更新

这个问题实际上是JavaScript的this动态绑定的问题,document是一个对象,在调用getElementById的时候是动态制定this,而使用c = document.getElementById的时候,c是一个指向这个方法的引用,但是调用的时候并没有给他动态绑定上它的this对象document,所以导致调用出错。Python由于对象的方法并不是完全等于定义的function,而是相当于把它自己的self对象放在了函数闭包里面,所以调用的时候不会出现问题。

var c = document.getElementById;c("a")// 等价于document.getElementById.call("a")// 正确的调用方法是document.getElementById.call(document, "a");

转载地址:http://mvuws.baihongyu.com/

你可能感兴趣的文章
linux安装docker
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>
spring boot jpa 实现拦截器
查看>>
jenkins + maven+ gitlab 自动化部署
查看>>
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>
java 流使用
查看>>
java 用流收集数据
查看>>
java并行流
查看>>
CompletableFuture 组合式异步编程
查看>>
mysql查询某一个字段是否包含中文字符
查看>>
Java中equals和==的区别
查看>>
JVM内存管理及GC机制
查看>>
Java:按值传递还是按引用传递详细解说
查看>>