浅析一个函数调用另一个函数的变量

js中一个函数中调用另一个函数,内部函数怎么访问外部函数的变量?
无意中逛到这个问题,突然发现自己以前也有这样的困惑

function a(){ alert(num);   }
function b(){  
      var num=3;
      a();
  }
b();   //num is not defined

a函数不是b的内部函数(闭包),而是全局函数。所以对于a函数来说,即使你b在内部调用了我a,我a还是访问不了你b。
说到底就是作用域问题,所以我想到了改变作用域的方法

call(),apply(),bind()

实现

function a(){ alert(num);   }
function b(){  
      var num=3;
      a.call(b);
  }
b();  // num is not defined

尝试了很多次,都无法获取到b,原来我对这些方法理解有误,查阅文档,发现此类方法主要作用是,对象调用不属于自己的方法,例如下例:
food函数是没有product方法,使用call对food的上下文进行product操作

//mozilla官方用例
function Product(name, price) {
  this.name = name;
  this.price = price;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = 'toy';
}
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

使用闭包

闭包就不多说了,一个函数内部定义(不是调用)另一个函数
内部函数可调用外部函数的变量,作用域链的延长

改写


function b(){  
      var num=3;
      function a(){ alert(num);   }
      a();
  }
b();  //3

传参

function a(num){ alert(num);   }
function b(){  
      var num=3;  
      a(num);
  }
b();  //3

return

function a(){ alert(b());   }

function b(){
var num=3;
return num;
}
a();

总结

一般来说,a是复用的函数,才会有此类用法,传参实现即可。

参考资料

深入浅出妙用 Javascript 中 apply、call、bind
学习Javascript闭包(Closure)
call()方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 4,704评论 2 6
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 8,979评论 0 1
  • 一说到写文章,很多人就开始摇头。实在是难。 曾经听过一个笑话:古时候有一个秀才,为了完成先生的布置的写文章的任务。...
    松柏文化阅读 4,134评论 5 4
  • 从秋天 到冬天 再到春天 直到夏天
    糖糖的唐阅读 1,139评论 0 0
  • 眨眼工夫就到了十一月了,在彷惶中寻找目标,寻找一个试图让自己不再迷茫的一种生活方式,寻找一个平衡:可以照顾好宝...
    甜小文阅读 1,810评论 0 2

友情链接更多精彩内容