第一个问题
var obj = function(){
var a = 0;
this.b = 0;
}
a
和b
的行为是否存在差异?
第二个问题
var x = 'a';
var f1 = function(x){ alert(x) }
var f2 = new Function('alert('+x+')')
f1
和f2
答案 0 :(得分:5)
var obj = function() {
var a = 0;
this.b = 0;
}
在函数中,您将能够访问这两个变量,但是在
的情况下var x = new obj();
...您将能够访问x.b
,但不能访问x.a
。
由于您的问题目前已写入,因此语法错误。以下内容适用:
var x = 'a';
var f1 = function(x){ alert(x) }
var f2 = new Function('alert('+x+')')
......但这与写作相同:
var x = 'a';
var f1 = function(x){ alert(x) }
var f2 = new Function('alert(a)')
这里的区别是显而易见的。 f1
忽略全局变量x
并提醒传递给它的任何内容,而f2
也忽略全局变量x
,并尝试查找全局变量{{1} }}。这可能不是你想要问的问题。
你可能想要的是这样的:
a
... 或这个:
var x = 'a';
var f1 = function(){ alert(x) }
var f2 = new Function('alert(x)')
上面两个替代方案之间的区别在于第一个总是使用全局变量var f1 = function(x){ alert(x) }
var f2 = new Function('x', 'alert(x)')
,而第二个从不使用任何全局变量。在两个示例中,内部x
和f1
之间的差异完全没有。
这两种方法可以生成完全相同的结果。您想要使用f2
方法的唯一原因是以某种动态方式生成代码,需要字符串输入以进行定义。一般来说,尽量避免这种做法。
答案 1 :(得分:4)
var obj = function() { // function expression, while obj is created before head
// it's only assigned the anonymous function at runtime
var a = 0; // variable local to the scope of this function
this.b = 0; // sets a property on 'this'
}
现在this
取决于你calling the function的方式。
另请注意函数statements and expressions之间的区别。
var x = 'a'; // string a, woah!
var f1 = function(x){ alert(x) } // another anonymous function expression
// Does not work
// 1. it's "Function"
// 2. It gets evaluated in the global scope (since it uses eval)
// 3. It searches for 'a' in the global scope
var f2 = new function('alert('+x+')') // function constructor
简而言之,从不使用Function
构造函数,它永远不会继承本地范围,因此您无法使用closures等。
答案 2 :(得分:2)
第一个问题:
var obj = function() {
var a = 0;
this.b = 0;
}
instance = new obj();
instance.showA = function() {
alert("this.a = " + this.a);
}
instance.showB = function() {
alert("this.b = " + this.b);
}
instance.showA(); // output undefined - local scope only, not even to methods.
instance.showB(); // output 0 - accessible in method
将其粘贴到Firebug控制台中并运行以查看自己的输出和行为。
第二个问题:
var f2 = new function('alert('+x+')');
这会在Firebug中引发语法错误,因为f应该大写。这是在字符串内定义并评估函数的情况。这是一个很好的例子:
var x = 'a=3';
var f2 = new Function('alert('+x+')');
f2(); // outputs 3 because the x passed into the variable is evaluated and becomes nested inside the quotes prior to the alert command being fired.
这是替换过程的样子:
1: x = "a=3";
2: 'alert(' + x + ')');
3: 'alert(' + 'a=3' + ')'); // x replaced with a=3
4: 'alert(a=3)';
5: 'alert(3);'
当函数运行时,会触发alert(3)。这可以用于执行从远程服务器下拉的其他JavaScript,但出于安全原因应该特别小心。在评估嵌套在引号中的代码时,它有助于从内部开始并一直工作到顶级上下文。有关处理嵌套引号或嵌入代码的更多信息,请访问:http://blog.opensourceopportunities.com/2007/10/nested-nested-quotes.html
答案 3 :(得分:0)
问题1:关于变量范围的作业(var b是封闭的{}的本地(在这种情况下是函数的本地)。
问题2:您可以使用eval而不是使用Function构造函数吗? {/ 3}},如
eval 'alert('+x+')';
答案 4 :(得分:0)
第二个问题非常有趣。只有基准可以说实话。
http://jsperf.com/function-vs-function/
http://jsperf.com/function-vs-function/1..8
http://jsperf.com/function-vs-constructor-vs-eval
http://jsperf.com/function-vs-constructor-vs-eval/1 .. 5
看起来他们几乎是平等的?我可以在现代浏览器中看到每个变体已经足够优化
但是要注意在循环中释放功能!
http://jsperf.com/function-vs-function/2
有任何明智的评论吗?
答案 5 :(得分:-1)
问题#1:两者都在本地设置,但是必须用function.b调用b 问题#2:我不相信f2会起作用......