在构造函数(x = x || y,z)中,逗号的含义是什么?

7

我已经找到一个答案,但它不足以扩展我的知识库。

我在StackOverflow上搜索了很长时间x = x || y, z的含义。

我找到了这个链接。 What does the construct x = x || y mean?

但是问题是, z是什么意思?

我经常看到这些表达式 window.something = window.something || {}, jQuery

我已经知道如果第一个参数返回false,则{}将被分配给something属性。

我的问题是,, jQuery是什么意思?

有人能启发我并向我灌输这个非常重要的知识吗?

更新 2014年8月11日

所以我尝试进行测试。

var w = 0, x = 1,y = 2,z = 3;
var foo = w || x || y, z; //I see that z is a declared variable
console.log(foo); //outputs 1

并且它与这个相同。

var w = 0, x = 1,y = 2;
var z = function(){return console.log("this is z");}
var foo = w || x || y, z; //same as this
console.log(foo); //still outputs 1

另外一个。

var w = 0, x = 1,y = 2;
var z = function(){return console.log("this is z");}
function foobar(){
this.bar = console.log(foo,z);
}(foo = w || x || y, z);
foobar(); //outputs 1 and string code of foobar

改变 (foo = w || x || y, z) 中 z 的值。
var w = 0, x = 1,y = 2;
var z = function(){return console.log("this is z");}
function foobar(){
this.bar = console.log(foo,z);
}(foo = w || x || y, z=4);
foobar(); //outputs 1 and 4

我认为在函数的 } 后面放置变量,与声明一个新变量是一样的。

另一个测试。

var w = 0, x = 1,y = 2,z = 1;
function foobar(){
    var bar = 10,z=2;
        console.log(z);
}(foo = w || x || y, z=4);
console.log(foo,z); // Seems that foo is public and made an output
foobar(); // outputs the z = 2 inside and disregards the z = 4 from (..., z=4)
console.log(z); // It seems that z is 4 again after calling foobar

然而,在像这样的场景中。 JSFiddle链接
//Self-Executing Anonymous Function: Part 2 (Public & Private)
(function( skillet, $, undefined ) {
    //Private Property
    var isHot = true;

    //Public Property
    skillet.ingredient = "Bacon Strips";

    //Public Method
    skillet.fry = function() {
        var oliveOil;

        addItem( "\t\n Butter \n\t" );
        addItem( oliveOil );
        console.log( "Frying " + skillet.ingredient );
    };

    //Private Method
    function addItem( item ) {
        if ( item !== undefined ) {
            console.log( "Adding " + $.trim(item) );
        }
    }    
}( window.skillet = window.skillet || {}, jQuery ));

//Public Properties
console.log( skillet.ingredient ); //Bacon Strips

//Public Methods
skillet.fry(); //Adding Butter & Fraying Bacon Strips

//Adding a Public Property
skillet.quantity = "12";
console.log( skillet.quantity ); //12

//Adding New Functionality to the Skillet
(function( skillet, $, undefined ) {
    //Private Property
    var amountOfGrease = "1 Cup";

    //Public Method
    skillet.toString = function() {
        console.log( skillet.quantity + " " + 
                     skillet.ingredient + " & " + 
                     amountOfGrease + " of Grease" );
        console.log( isHot ? "Hot" : "Cold" );
    };    
}( window.skillet = window.skillet || {}, jQuery ));

try {
    //12 Bacon Strips & 1 Cup of Grease
    skillet.toString(); //Throws Exception
} catch( e ) {
    console.log( e.message ); //isHot is not defined
}

似乎如果去掉jQuery,它只会记录“Bacon Strips”。请参考此链接(另一个JSFiddle链接)(已删除jQuery)。
我真的不太明白这个...但是为什么在函数的}之后的( )中有jQuery,当jQuery库已经包含时,它算作完全运行代码的参考?
从代码中删除$.trim后,它似乎又正常工作了。但我仍然不明白这个引用是如何工作的。 (没有, jQuery$.trim的JSFiddle链接)

9
你能分享一个你曾经看到这种情况的上下文吗?通常在本地变量声明中执行此操作,例如 var p = x || y, z 以声明2个本地变量...但正如 user2864740 所说,这只是两个不同的语句。 - Arun P Johny
4
也许是 var x = x || y, z... - johnwait
4
这是否在函数调用中?看起来非常像是传递了jQuery参数。你应该增加上下文信息。 - Ry-
@johnwait 很好的点子,展示了更广泛的背景会如何澄清事情。 - user2864740
1
稍微扩展一下@ArunPJohny所说的,var p = x || y, z可以等同于var p = x || y var z(两个独立的定义)。 z的值仍然为“undefined”。 它类似于类似于var foo ='bar',bar ='foo',you ='see?';的东西。 - scrowler
大家好,我快要得到答案了,我已经更新了我的帖子,但我仍然不明白它是如何工作的。我添加了上下文以更清楚地了解这个问题。 - Mike Ante
1个回答

6
JavaScript中的逗号运算符会评估操作数并返回最后一个(最右边)的值。根据JS 运算符优先级,OR操作将首先进行评估,然后是赋值。
因此,表达式x = x || y, z实际上是(x = (x || y)), z。OR运算符将返回比较的布尔结果或对于非布尔类型,如果第一个操作数为真,则返回第一个操作数,否则返回第二个操作数。赋值运算符的优先级也高于逗号运算符,因此x将被赋予OR返回的值。变量z的值对OR运算或赋值没有任何影响。实际上,它将在最后进行评估,这意味着它基本上是一个单独的语句,对该“表达式”中的任何其他内容都没有影响。我无法看出以那种方式编写表达式的实际价值。

我明白了,但我仍然不明白为什么一开始会有z。这是一个jQuery的例子。 http://jsfiddle.net/fssj71mp/1/我试图理解,jQuery是用来干什么的。感谢您的努力。这可能接近我要找的答案,但不完全是我想要的。+1我更新了我的帖子,请看看是否有任何解释。谢谢 :) - Mike Ante
1
@Mike 在这种情况下,逗号只是分隔函数参数。看一下这个jsFiddle。这是典型的过程:定义一个带有两个参数的函数function foo(a, b) {...}。然后通过foo(1, 2)来调用它。你的例子基本上是foo(a, b),但你只是将函数定义为匿名和自执行。你的第一个参数(a)也是一个更复杂的表达式:window.skillet = window.skillet || {}(只是确保全局定义了变量skillet)。所以,, jQuery只是传递第二个参数b - nbrooks
我明白了...最后一个问题.. 在我将其标记为答案之前。(function somefunction(a,b) {console.log(a,b);}(1,2)); 在这段小代码中,(a,b)表示参数,并在}后面添加(1,2)表示你正在调用函数,是吗?如果你用新的参数somefunction(3,4)调用somefunction(a,b),那么值(1,2)仍然会被重用,除非它们被覆盖了,是吗? - Mike Ante
在这种情况下,您将无法重复使用该函数,因为整个语句不是函数声明而是方法调用。您将无法在全局范围内引用 somefunction(尽管它可以递归地引用自身)。试试吧,您会得到一个“somefunction未定义”或类似的错误。如果您只是在一个语句中定义了一个命名函数,并在另一个语句中使用 (1,2) 调用它,则使用 (3,4) 的单独调用将不知道原始参数(除了一些缓存/全局变量技术)。 - nbrooks
我尝试了一些东西,这确实帮了很多!谢谢 Brooks 先生! http://jsfiddle.net/n01ojnba/1/ - Mike Ante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接