js 公有方法通过 new Function 方式调用私有方法的问题?

2016-05-22 17:46:25 +08:00
 ftfniqpl
var Circle = function() {
   var pi = function(){
       return '3.14159';
    };

   this.area = function( str) {
       console.log(eval(str)());    //能正确调用
       console.log(new Function('return '+str));     如何调用??
   };
}
var c= new Circle();
c.area('pi');
3289 次点击
所在节点    Node.js
10 条回复
littlepanzh
2016-05-22 18:29:30 +08:00
LZ 这个写法……可以当面试题了,考察变量作用域……典型的反面教材……
SoloCompany
2016-05-22 18:31:11 +08:00
new function 和 eval 完全没区别,都是毫无安全性可言,你漏了执行 function 这一步而已
ftfniqpl
2016-05-22 18:45:20 +08:00
@SoloCompany 当我使用 new Function('return '+str).call());的时候,会提示 pi is not defined. 应该是 new Function 的时候需要使用 apply 传入作用域,不知道传啥?
SoloCompany
2016-05-22 18:54:39 +08:00
@ftfniqpl 如果是这样的话就说明 new function 不能访问闭包了,建议去查一下 ecma 规范吧
xavierchow
2016-05-22 22:46:58 +08:00
Note: Functions created with the Function constructor do not create closures to their creation contexts; they always are created in the global scope. When running them, they will only be able to access their own local variables and global ones, not the ones from the scope in which the Function constructor was called. This is different from using eval with code for a function expression.

-- http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
surgit
2016-05-22 23:06:26 +08:00
不是 FUNCTION 的问题.
c.area('pi'); 这里的 pi 肯定取不到你构造函数里的静态方法 pi 的.
写代码还是少带点奇技淫巧的好.你这里传 function 作为参数.
magicdawn
2016-05-23 08:07:20 +08:00
new Function 只可访问全局变量哦~

var Circle = function() {
var pi = function(){
return '3.14159';
};

var locals = {
pi: pi
};

this.area = function( str) {
return locals[str] && locals[str]();
};
}
var c= new Circle();
c.area('pi');
magicdawn
2016-05-23 08:16:39 +08:00
new Function 可以传参哦

sagnitude
2016-05-23 08:30:19 +08:00
应该是这儿
http://www.ecma-international.org/ecma-262/5.1/index.html#sec-10.4.2

eval: 10.4.2 的 2.b, 2.c , eval 会把当前执行 context 设为调用者的 context (VariableEnvironment)
所以能调到局部变量

new Function: 10.4.3 的 5 和 7 ,把当前执行环境设为 NewDeclarativeEnvironment(Function.prototype.[[Scope]]),所以得不到局部变量
napsterwu
2016-05-23 09:27:05 +08:00
就没有人给楼主一个正确的姿势吗。。
http://jsbin.com/vefadiyidi/edit?js,console

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280463

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX