你的位置:首页 > 软件开发 > Java > 例证关于js中call和apply的误解

例证关于js中call和apply的误解

发布时间:2015-06-07 12:00:16
发现一些文章对call和apply的存在误解,因为误解的解释方式比较容易被理解吧,当然也有批判的,但都只是说说怎么才是对的,没有具体分析误解为什么是误解今天让我们来仔细分析一下,为何不恰当function add(a, b) { alert(a + b);}function ...

例证关于js中call和apply的误解

发现一些文章对call和apply的存在误解,因为误解的解释方式比较容易被理解吧,当然也有批判的,但都只是说说怎么才是对的,没有具体分析误解为什么是误解今天让我们来仔细分析一下,为何不恰当

function add(a, b) {   alert(a + b);}function sub(a, b) {   alert(a - b);}add.call(sub, 3, 1);   //4
恰当理解: 以上为从网络上摘选的观点OK,首先,我们来看下什么是上下文:在JavaScript中,你的代码将总是有着某种形式的上下文(代码在其内部工作的对象)。上下文是通过变量this工作的,变量this总是引用代码当前所在的那个对象。全局对象实际上是window对象的属性,这意味着即使是在全局上下文里,this变量仍然引用一个对象。搞清了上下文,那么我们来看这样一个函数

function test() {   var myValue = 1;   this.value = 2;}
看到这里会不会有很奇怪的感觉了?真的是这样么?我们继续看,把add改一下

function add(a, b) {   alert(this);}function sub(a, b) {   function inner() {     this.value = arguments[0] - arguments[1];     return this.value   };}add.call(sub, 3, 1); 
“说词1”完全不对,sub被替换成add后怎么this还会是sub?我们再来看一看,什么情况下会把函数代码体本身给输出来?

function test(a, b) { this.value = 1;}console.log('test:', test );console.log('test():', test() );console.log('new test():', new test() ); 
输出函数的引用,才会把函数代码体本身给输出基于这一结论,我们把本文最开始的代码这样改造一下,此时sub才参与工作了

function add(a, b) {   alert(a + b);   this(a, b)   //此处相当于执行sub}function sub(a, b) {   alert(a - b);}add.call(sub, 3, 1);   //4   //2
再次根据“说词”派的解释,this.inner(a, b)交给了sub来执行,执行者是sub,那么this.inner()的caller必定指向sub

输出的结果是add

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:例证关于js中call和apply的误解

关键词:JS

JS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。