我最近开始维护其他人的JavaScript代码.我正在修复错误,添加功能,并尝试整理代码并使其更加一致.
以前的开发人员使用两种声明函数的方法,如果背后有原因,我就无法解决.
这两种方式是:
var functionOne = function() {
// Some code
};
Run Code Online (Sandbox Code Playgroud)
function functionTwo() {
// Some code
}
Run Code Online (Sandbox Code Playgroud)
使用这两种不同方法的原因是什么?每种方法的优缺点是什么?有一种方法可以通过一种方法完成,而另一种方法无法完成吗?
我知道在JavaScript中语法如下:
function myfunction(param){
//some code
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在jQuery中声明一个可以添加到元素中的函数?例如:
$('#my_div').myfunction()
Run Code Online (Sandbox Code Playgroud) 从ES2015(ES6)开始,函数具有适当的名称(包括官方name属性),除了明显的函数声明和命名函数表达式(例如赋值给变量)之外,还以各种方式创建函数时分配名称(函数的名称设置为变量的名称),分配给对象属性(函数的名称设置为属性的名称),甚至函数参数的默认值(函数的名称设置为参数的名称).但是,在现有对象上(例如,不在对象初始值设定项中)分配属性不会将该属性的名称分配给该函数.为什么不?当然必须有一个特定的理由,这是不可取的/可能的.它以前如何?
要明确:我不是在问如何解决它.我问是什么阻止了这个看似很明显的案例在被许多其他人(包括默认参数值!)处理时被处理.一定有充分的理由.
请不要推测或理论化.TC39有理由不包括它.我对这个原因感兴趣.我已经通过了TC39会议记录,但还没有找到它.到目前为止,我发现的最接近的是艾伦· 威尔夫斯 - 布洛克回复贝尔吉说,由于"各种反对意见",没有就此形式达成共识,但遗憾的是他没有说出那些反对意见.
细节:
以下所有内容都foo在兼容的浏览器上为该功能指定名称:
// Requires a compliant browser
// Assigning to a variable or constant...
// ...whether in the initializer...
{
let foo = function() { };
console.log("1:", foo.name); // "foo"
}
{
const foo = function() { };
console.log("2:", foo.name); // "foo"
}
// ...or later...
{
let foo;
foo = function() { };
console.log("3:", foo.name); // "foo"
}
// As …Run Code Online (Sandbox Code Playgroud)我见过其他人使用以下模式.
var bar = function foo(){};
console.log(bar); // foo()
console.log(foo); // ReferenceError: foo is not defined
Run Code Online (Sandbox Code Playgroud)
但为什么?如果两者都被宣布,我可以看到这一点,但事实并非如此.原因是什么?
在代码中,我使用的是命名类"Car".现在,如果我尝试使用喜欢var carNew = new Car("ferrari");,那么它会给我一个错误.那么ES6中命名类表达式的用途是什么?
'use strict';
var car = class Car{
constructor(model){
this.model = model;
}
}
var carNew = new car("ferrari");
console.log(carNew); //car {model: "ferrari"}
console.log(carNew.constructor == car); //true
Run Code Online (Sandbox Code Playgroud) 通常,在Javascript中,当我想将匿名/内联函数作为参数传递给另一个函数时,请执行以下操作之一。
someFunctionCall(function() {
//...
});
someFunctionCall( () => {
//...
});
Run Code Online (Sandbox Code Playgroud)
但是,我最近继承了一个使用命名函数作为内联参数的代码库,如下所示
someFunctionCall(function foo() {
//...
});
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这种语法。该函数似乎仍然是匿名的- foo在调用范围或被调用范围中都没有定义函数。这仅仅是样式问题,还是可以使用命名函数(foo上述)作为匿名函数来更改该程序的行为或状态?
这是专门针对NodeJS(不是基于浏览器的程序)程序的,并且我对使用函数作为参数的特定行为特别感兴趣。也就是说,欢迎跨平台和运行时提供来自行为的信息。
javascript closures anonymous-function node.js function-expression
在Babel JS的在线REPL(http://babeljs.io/repl/)中,当我输入时:
let a = (x) => x+1
Run Code Online (Sandbox Code Playgroud)
它将被转化为:
"use strict";
var a = function a(x) {
return x + 1;
};
Run Code Online (Sandbox Code Playgroud)
这var a = function a(x)看起来有点令我困惑,因为我理解其中任何一个var a = function(x)或function a(x)足够.
有没有人有关于何时以及为什么需要将命名函数分配给变量的想法?
如果你不能用你给它们的名字真正引用它们,那么命名函数表达式有什么意义呢?
var f = function g() {
console.log("test");
};
g(); // ReferenceError: g is not defined
Run Code Online (Sandbox Code Playgroud) 因此,在阅读了TJ Crowder对这个问题的回答之后,似乎ES 6规范具有推断绑定到变量名的匿名函数的函数名的规则.我们还需要使用命名函数表达式吗?看起来ES6使它变得不必要了.
var f=function foo()
{
console.log("hello");
};
f();
foo();
Run Code Online (Sandbox Code Playgroud)
这会产生一个错误:"异常:ReferenceError:foo未定义"
但是"foo"是定义的.为什么会发生这种情况?我知道这是一个函数表达式,"f()"用于访问此函数.但这不是一个匿名函数,我有一个这个函数的名字.为什么我无法使用其名称访问该功能?
javascript ×10
function ×5
ecmascript-6 ×3
closures ×1
idioms ×1
jquery ×1
node.js ×1
syntax ×1