Javascript不支持捕获?

Javascript不支持捕获?,javascript,Javascript,javascript不进行捕获,这是对的吗 以下示例: var names = ['zero', 'one', 'two', 'three']; var nameByIndex = function (n){ return names[n]; }; //in C++ now names would be captured f.e. "by value" console.log(nameByIndex(1)); names = undefined; //with C++ capturing

javascript不进行捕获,这是对的吗

以下示例:

var names = ['zero', 'one', 'two', 'three'];

var nameByIndex = function (n){
  return names[n];
}; //in C++ now names would be captured f.e. "by value"

console.log(nameByIndex(1));
names = undefined; //with C++ capturing by value, this would have no "side-effect"
console.log(nameByIndex(1));
var names = ['zero', 'one', 'two', 'three'];

var nameByIndex = (function(names) {
    var _names = names;
    return function (n){
        return _names[n];
    };
})(names);

console.log(nameByIndex(1)); // outputs one
names = undefined; 
console.log(nameByIndex(2)); // outputs two
现在就我所知,函数没有捕获名称

编辑:只有通过iLife按值传递
名称时,才会发生捕获,对吗?
例如:

var names = ['zero', 'one', 'two', 'three'];

var nameByIndex = (function(names) {
    var _names = names;
    return function (n){
        return _names[n];
    };
})(names);

console.log(nameByIndex(1)); // outputs one
names = undefined; 
console.log(nameByIndex(2)); // outputs two

解决方案:好的,现在我知道了,如果它通过IIFE传递值,返回的闭包会执行函数本地查找并找到“传递值”名称。如果没有IIFE,它看起来像一个引用捕获,但在执行函数时,它只是外部范围中的一个查找

我不太清楚您所说的捕获是什么意思,但您正在销毁您的函数具有作用域访问权限的
names
变量

因此,为了回答您的问题(我认为),您的函数不会保留
名称的本地副本,它将始终引用最近的范围

您可以通过这样的方式实现它,它将在本地范围内保存
名称
,即使在外部范围内被销毁

var names = ['zero', 'one', 'two', 'three'];

var nameByIndex = (function(names) {
    var _names = names;
    return function (n){
        return _names[n];
    };
})(names);

console.log(nameByIndex(1)); // outputs one
names = undefined; 
console.log(nameByIndex(2)); // outputs two

日志是什么?“第二个和第一个有何不同?”米加愚蠢的技术问题。该函数可以从外部作用域访问变量,因此即使它在技术上不是闭包(我真的怀疑,这是一个相当奇怪的闭包定义),它仍然非常清楚它的含义。@meagar问题中的代码可能是另一个函数的一部分(在这种情况下,
names
定义前面的
var
将使其成为本地变量)。而且,无论OP在这里发现什么混淆行为,它在全局作用域还是在另一个函数中的行为都是相同的。@delnan我不是说它的行为不同;我是说需要使用两个作用域共享的不同变量提供
namesByIndex
,以便设置将共享变量ng为新值不会影响
namesByIndex
所需的副本。这样做:
var namesByIndex=(函数(名称){return function(i){return names[i]})(名称)对不起,读我的评论,我在争论错误的事情。@ Cakl:我相信一个C++等价物是一个引用lambda <代码> [[](PARAM]){体}的捕获。……虽然我对C++非常陌生,但我可能错了。基本上,函数创建了一个新的词法范围,因此,可以引用外部范围中的变量。函数中的代码总是读取变量的当前状态。