首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript:闭包可以通过值而不是引用来访问封闭作用域中的变量吗?

JavaScript:闭包可以通过值而不是引用来访问封闭作用域中的变量吗?
EN

Stack Overflow用户
提问于 2014-10-28 19:20:59
回答 1查看 109关注 0票数 1

下面的JavaScript代码演示了JavaScript (闭包)函数如何通过引用而不是通过值访问其封闭环境中的变量。

代码语言:javascript
复制
var sum; // global variable

function outer() {
  var hundred_more = 100;
  sum = function (a, b) {
    return a + b + (++hundred_more);
  };
  sum2 = function (a, b) {
    return a + b + (++hundred_more);
  };
  alert(hundred_more);
}
outer(); // define sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 118
alert(sum2(5, 10)); // 119
outer(); // redefine sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 118
alert(sum2(5, 10)); // 119

PHP中的相同代码如下所示:

代码语言:javascript
复制
<?php

$sum = null; // global variable
$sum2 = null; // global variable

function outer() {
  global $sum;
  global $sum2;
  $hundred_more = 100;
  $sum = function ($a, $b) use (&$hundred_more) {
    return $a + $b + (++$hundred_more);
  };
  $sum2 = function ($a, $b) use (&$hundred_more) {
    return $a + $b + (++$hundred_more);
  };
  var_dump($hundred_more);
}
outer(); // define sum at the global scope and print 100
var_dump($sum(5, 10)); // 116
var_dump($sum(5, 10)); // 117
var_dump($sum2(5, 10)); // 118
var_dump($sum2(5, 10)); // 119
outer(); // redefine sum at the global scope and print 100
var_dump($sum(5, 10)); // 116
var_dump($sum(5, 10)); // 117
var_dump($sum2(5, 10)); // 118
var_dump($sum2(5, 10)); // 119

为了在PHP中通过值而不是引用从封闭环境中传递变量,只需在use关键字之后省略变量前面的符号(&)。这将导致在定义函数时将值复制到函数的闭包作用域中,以便所有'var_dumps‘打印值116。是否有可能在JavaScript中以某种方式实现相同的构造(变量通过值而不是引用传递到内部闭包)?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-28 19:26:45

好吧,你可以为它再找个了结.

代码语言:javascript
复制
function outer() {
    var hundred_more = 100;
    sum = (function(hundred_more){
        return function (a, b) {
          return a + b + (++hundred_more);
        };
    })(hundred_more);
    sum2 = (function(hundred_more){
        return function (a, b) {
          return a + b + (++hundred_more);
        };
    })(hundred_more);
    alert(hundred_more);
}
outer(); // define sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 116
alert(sum2(5, 10)); // 117
outer(); // redefine sum at the global scope and print 100
alert(sum(5, 10)); // 116
alert(sum(5, 10)); // 117
alert(sum2(5, 10)); // 116
alert(sum2(5, 10)); // 117

它实际上不是通过引用传递的;它们只是引用相同的变量。通过创建一个新闭包,我们通过引用传递旧的闭包,并得到解耦的变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26616752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档