javascript对象变量和函数
第一个问题javascript对象变量和函数,javascript,Javascript,第一个问题 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问题1:变量范围的作业(变量b是封闭的{}的局部变量(在这种情况下是函数的局部变量) 问题2:您可以使用eval?,而不是使用函数构造函数,如中所示
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
问题1:变量范围的作业(变量b是封闭的{}的局部变量(在这种情况下是函数的局部变量)
问题2:您可以使用eval?,而不是使用函数构造函数,如中所示
现在,这个是什么取决于你的工作方式
还要注意函数之间的差异
简而言之,永远不要使用
函数
构造函数,它永远不会继承局部作用域,因此您不能使用它等等。第一个问题:
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);'
函数运行时,发出警报(3)被激发。这可用于执行从远程服务器下拉的其他JavaScript,但出于安全原因,应格外小心。在评估嵌套在引号中的代码时,它有助于从内部开始,逐步升级到顶级上下文。有关处理嵌套引号或嵌入代码的详细信息,请访问e在此处找到:问题1
在函数中,您可以访问这两个变量,但在
var x = new obj();
…您可以访问x.b
,但不能访问x.a
问题2
由于您的问题是目前编写的,这是一个语法错误。以下操作将起作用:
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
,并尝试查找全局变量a
。这可能不是您想要问的问题
您可能想要的是这样的:
var x = 'a';
var f1 = function(){ alert(x) }
var f2 = new Function('alert(x)')
……或者:
上述两个备选方案之间的区别在于,第一个始终使用全局变量x
,而第二个从未使用任何全局变量。在两个示例中,f1
和f2
之间的内部差异根本没有
这是两种生成完全相同结果的方法。您希望使用f2方法的唯一原因是,以某种动态方式生成代码时,需要输入字符串来定义它。通常,请尽量避免这种做法。第二个问题非常有趣。只有基准测试才能说明真相 ..5 看起来它们几乎相等?我可以看到在现代浏览器中,每个变体都经过了充分的优化
但要注意在循环中重新创建函数!
有什么明智的评论吗?我记得在我的计算机科学课上做过类似的事情,但不是用JavaScript。而是用Ocaml、ML或Lisp。这就是为什么JavaScript如此酷的原因,因为它可以与我们只在学术界遇到的那些奇特语言结合在一起。我只是不怕问愚蠢的问题。)请一次问一个问题。@Raynos什么时候才能“正确”使用它?您总是将代码包装到匿名包装器中
新函数
不继承该范围,它总是会带来麻烦。不要告诉我你的V8版冒险经历:当我进行黑客攻击时,想在关闭时快速在全球范围内捣乱。
var x = new obj();
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)')
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)')