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)')