小编les*_*ang的帖子

JavaScript中的每个函数都是闭包是真的吗?

我知道JavaScript中的每个函数都是一个第一类对象,它有一个内部属性[[scope]],它承载函数自由变量的绑定记录.但是,有两种特殊情况.

  1. 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)

    这是不直观的.这也叫封闭吗?

  2. 如果内部函数没有任何自由变量,我们可以说在创建内部函数时会形成闭包吗?例如,

    // 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 closures ecmascript-5

8
推荐指数
2
解决办法
1224
查看次数

JavaScript是否具有l值和r值的概念?

在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)

我的问题是:

  1. JavaScript也有l值和r值的概念为C吗? …

javascript expression referenceerror ecmascript-5

5
推荐指数
1
解决办法
2160
查看次数

有没有办法在迭代中修改Set数据结构(ECMAScript 6)?

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对象相同的效果?

ecmascript-6

1
推荐指数
1
解决办法
54
查看次数