Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是什么JavaScript/JQuery语法?_Javascript_Jquery - Fatal编程技术网

这是什么JavaScript/JQuery语法?

这是什么JavaScript/JQuery语法?,javascript,jquery,Javascript,Jquery,我不知道如何搜索这个,所以我在这里问 我继承了一个项目,这里没有人知道这个语法技巧叫什么 如果从列表中选择了一个或另一个特定值,则有一个选择下拉更改事件将调用函数 $('#accordion select[name=x_range]').change(function(){ $('#custom-time')[$(this).val() == 'custom' ? 'show' : 'hide'](); $('#custom-time-to-now')[$(this).val() ==

我不知道如何搜索这个,所以我在这里问

我继承了一个项目,这里没有人知道这个语法技巧叫什么

如果从列表中选择了一个或另一个特定值,则有一个选择下拉更改事件将调用函数

$('#accordion select[name=x_range]').change(function(){
  $('#custom-time')[$(this).val() == 'custom' ? 'show' : 'hide']();
  $('#custom-time-to-now')[$(this).val() == 'custom_to_now' ? 'show' : 'hide']();
  updateTimeIntervalOptions();
}).triggerHandler('change');
在这种情况下,在自定义时间或自定义时间到现在div上调用show或hide函数

调用这样的函数是什么

编辑: 我应该说我理解三元if/else,但不理解$selector[function_name]部分

调用这样的函数是什么

糟糕的编码实践

这是一种动态调用显示或隐藏函数的方法。看起来真是糟透了

编辑:显然,我的回答对一些人来说是有争议的。请让我澄清一下:如果我能在三元运算符上编写if-else语句——特别是对于字符串比较之类的事情——我肯定会在较短的代码上更清晰

这并不是因为三元运算符或方法的括号访问而看起来很糟糕。这看起来真是糟糕透了,因为代码在清晰性上走了一条捷径,在不需要的时候走了这条捷径


三元运算符也不错。支架的使用情况不错。但是它们是易变的概念,很容易被滥用。

显然它被称为

它被称为数组表示法。看这里:

作者正在使用三元运算符:要使用数组表示法调用jQuery对象的成员函数,请使用el['show']而不是el.show。分解后,它看起来像:

var fnName;
if($(this).val() == 'custom') {
  fnName = 'show';
} else {
  fnName = 'hide';
}

$('#custom-time')[fnName]();  // an alternative to $('#custom-time').show() or .hide()

我不认为这种模式有一个特定的名称。有一个用于选择不同方法名称的条件运算符,然后使用此字符串和括号或数组语法动态调用该方法。

三元运算符可以嵌套两个或多个选项的值

将它们视为开关、if/else或if/elseif/../else操作,但仅用于设置一个值

因此,请看以下内容:

var name = X === Y ? "Bob" : "Doug";
sayHello(name);
这是一个三元条件,根据条件是真还是假,可以选择设置名称

在jQuery中,他们只是跳过了一步,使用了括号表示法,里面有一个三元

People[ (selected_person === "Bob") ? "Bob" : (selected_person === "Doug") ? "Doug" : "Jimmy" ].sayHi();
这将根据所选人员的值为People.Bob、People.Doug或People.Jimmy调用sayHi

这是一个三元条件,用于选择对象属性,嵌套在括号符号中,而不是分两步进行:

 var person = // ternary from last step
 People[person].sayHi();
编辑:

根据您的编辑,它是括号表示法

MyObj = { myFunc : function () { doStuff(); } };
您可以用几种不同的方式调用myFunc。 使用点表示法:var func=MyObj.myFunc;或通过括号表示法:var func=MyObj[myFunc]; 无论哪种方式,func的值现在都是myFunc

因此,他们所做的是为他们想要调用的函数的名称设置一个字符串

var string=show; MyObj[string]/=MyObj.show MyObj[string]/=MyObj.show


在您的代码中,他们使用三元来确定字符串的值。

我认为这不是一个技巧,而是了解javascript的三个特性

首先,函数是第一类对象,所以您可以将它们分配给变量等

 var f = function () { ... }
 var b = [];
 b[1] = f; // assigning function to array element
 b[1]();   // calling function assigned to array element
第二,方便的三元运算符,它是if和赋值组合的有效简写符号:

 var a = (b >c ) ? b : c;

 // is the same as

 if (b > c ) {
     a = b;
 } else {
     a = c;
 }
最后但并非最不重要的是,每个对象属性都可以作为字典元素访问,即

 a.b = 5
 a['b'] === 5 // true! 
所以把所有这些放在一起,你可以有这样的表达

$(selector)[condition?'show':'hide']();
这等于

if (condition) {
   $(selector).show();
} else {
   $(selector).hide();
}
更新:关于这个特殊案例的一个注释。在大多数情况下,您不需要做这样复杂的事情,因为$.toggle接受用于开关的布尔参数,所以

$(selector)[condition?'show':'hide']();
将以与相同的方式工作

$(selector).toggle(!!condition);

请注意,我使用!!为了将值强制转换为布尔值,as toggle使用==

检查参数。。。哦,我非常想念伦敦。这是动态选择要调用的函数的最简单方法。@jbabey在某些情况下,可以接受这样做。但是,在这种情况下,为什么不使用if语句呢?我总是建议使用if语句而不是三元运算符,因为许多没有经验的程序员将更短的代码等同于更好的代码。总的来说,这是一个糟糕的方法,因为更好的方法是非常明显的。我也不同意,这是一个非常有效的方法,即使我同意if/else更具可读性,用括号和三元组也很明显,我不认为一种方法比另一种更好,在我看来,这绝对不是糟糕的编码实践。@adeneo我想这可以归结为一个观点和经验的问题。我来自软件工程背景,那里的编码标准相当严格。我总是把可读性放在捷径之上。正如我所说,虽然在少数情况下可以使用括号访问动态调用函数,但
我绝对不会这样做。看看我编辑过的答案。在我看来,他们选择用这种模糊的方法显示/隐藏是愚蠢的。如果他们知道,它可以清楚地写为$selector.togglecondition。