我知道JavaScript中的每个函数都是一个第一类对象,它有一个内部属性[[scope]],它承载函数自由变量的绑定记录.但是,有两种特殊情况.
Function构造函数创建的函数也是一个闭包吗?Function构造函数创建的函数对象是特殊的,因为它的[[scope]]可能不引用其外部函数的词法环境,而只引用全局上下文.例如,
var a = 1;
var fn = (function outer() {
var a = 2;
var inner = new Function('alert(a); ');
return inner;
})();
fn(); // will alert 1, not 2.
Run Code Online (Sandbox Code Playgroud)
这是不直观的.这也叫封闭吗?
如果内部函数没有任何自由变量,我们可以说在创建内部函数时会形成闭包吗?例如,
// This is a useless case only for academic study
var fn = (function outer() {
var localVar1 = 1,
localVar2 = 2;
return function() {};
})();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,fn指的是作为内部函数创建的空函数对象.它没有自由变量.在这种情况下我们可以说闭合形成了吗?
在JavaScript中,如果在赋值表达式的左侧放置某种表达式,引擎将抛出ReferenceError.例如,
// 'this' on the left side
this = window; // ReferenceError: Invalid left-hand side in assignment
Run Code Online (Sandbox Code Playgroud)
要么
// function call expression on the left side
var a;
var fn = function() {return a};
a === fn(); // true
a = 1; // 1
fn() = 5; // ReferenceError: Invalid left-hand side in assignment
Run Code Online (Sandbox Code Playgroud)
要么
var a;
a = 1; // 1
(a) = 2; // 2
(1, a) = 3; // ReferenceError: Invalid left-hand side in assignment
Run Code Online (Sandbox Code Playgroud)
我的问题是:
JavaScript也有l值和r值的概念为C吗? …
SetES6中的对象有一个forEach方法,就像Array对象一样.有没有办法在Set使用该forEach方法迭代对象时修改值?
例如:
// Array object in ES5 can be modified in iteration
var array = [1, 2, 3];
array.forEach(function(int, idx, a) {
a[idx] = int * int;
});
array; // => [1, 4, 9]
Run Code Online (Sandbox Code Playgroud)
但是当迭代Set对象时,
// Set will not be updated
var set = new Set([1, 2, 3]);
set.forEach(function(val1, val2, s) {
val2 = val1 * val1;
})
set; // => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
有没有办法达到与Array对象相同的效果?