js 公有方法通过 new Function 方式调用私有方法的问题?
var Circle = function() {
var pi = function(){
return '3.14159';
};
this.area = function( str) {
console.log(eval(str)()); //能正确调用
//提示pi is not defined,该如何调用??
console.log(new Function('return '+str).call());
};
}
var c= new Circle();
c.area('pi');
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
原因:通过
new Function
生成的函数对象的外部词法环境是全局环境,而不是包裹它的那个函数的词法环境。所以它不能访问到外层函数(以及外层函数的外层函数)中定义的变量。15.3.2.1 new Function
换句话说,它的“作用域链”绕过了外层的n层函数,直接链接到了全局作用域。
如果只是想调用的话,可以这样写.
上面已经解释了为什么访问不到,我这里按照你的要求给出个方案,看看是不是你要的
new Function
eval
new Function('return '+str).call();
语句中new Function('return '+str)
创建了一个函数对象,call方法调用这个函数对象。如果作用域正确,调用的结果是返回一str表示的对象的字符串表示如果str标示在JD解析器解析后是一个函数对象并且你想调用它,那么需要再调用一次
如
new Function('return '+str).call()();
或
new Function('return '+str)()();
一定要调用new Function,那么可以使用如下方式,供参考