javascript对象变量和函数

时间:2011-01-11 08:26:50

标签: javascript

第一个问题

var obj = function(){  
    var a = 0;  
    this.b = 0; 
}

ab的行为是否存在差异?


第二个问题

var x = 'a';
var f1 = function(x){ alert(x) }
var f2 = new Function('alert('+x+')')

f1f2

的行为是否有任何差异

6 个答案:

答案 0 :(得分:5)

问题1

var obj = function() {
   var a = 0;
   this.b = 0;
}

在函数中,您将能够访问这两个变量,但是在

的情况下
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,并尝试查找全局变量{{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)') ,而第二个从不使用任何全局变量。在两个示例中,内部xf1之间的差异完全没有。

这两种方法可以生成完全相同的结果。您想要使用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会起作用......