【问题标题】:Modify a variable inside a function [duplicate]修改函数内的变量[重复]
【发布时间】:2014-03-25 13:30:07
【问题描述】:

假设我有一个内联脚本标签,其代码非常简单,如下所示

(function() {
 var test = "This is a simple test";

 function modifyTest(s) {
  s = "Modified test text";
 };

 modifyTest(test);
 console.log(test) //Will still display "This is a simple test"

 })();

但是,如果我使用 test = modifyTest(test); 更改已应用我的问题是这样的。 这是在函数内部修改 javascript 变量的唯一方法吗,这意味着我必须始终这样做

source = function(source); 为了改变函数内部的变量,

还是我错过了阻止我完成此任务的范围概念?

【问题讨论】:

  • JavaScript 使用按值传递,而不是按引用传递。赋值给一个变量从不会改变另一个变量的值。如果要更改特定变量的值,则必须显式分配给该变量。
  • @Felix Kling:“使用按值传递,而不是按引用传递”——这并不完全正确。它通过值传递引用(对于引用类型)
  • @zerkms:我很确定。如果您考虑到对象,则值是对对象的引用。 pass-by-reference 是一个定义非常明确的术语。
  • @zerkms:否。通过引用传递或分配意味着变量获得对另一个变量的引用,而不是对其值的引用。 JavaScript 总是按值传递,对于对象,该值是对对象的引用,而不是对变量的引用。您所指的是在维基百科文章中称为共享调用:en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing,但本质上它是按值传递。
  • 呃,都在同一点上-“它通过值传递引用”| “本质上是按值传递”

标签: javascript function


【解决方案1】:

您说的是“通过引用”调用函数。 JavaScript(与大多数其他函数式语言一样)不支持这一点,因为更改当前范围之外的变量是一种副作用,这与函数式编程范式相矛盾。

不过,您始终可以在当前范围内更改变量。因此,在另一个函数中定义的任何函数都可以更改外部函数的任何局部变量。

【讨论】:

    【解决方案2】:

    modifyTest 函数本质上是创建一个名为s 的局部函数级变量;该变量只存在于函数的作用域内,所以修改它不会影响外部作用域。

    如果你想修改外部作用域,你不会使用参数:

    var test = "This is a simple test";
    function modifyTest(){
        test = "modified test text";
    }
    console.log(test);   // This is a simple test
    modifyTest();
    console.log(test);   // Modified test text
    

    并不是说你可以修改通过引用传递的对象,所以你可以修改某些东西的属性:

    var o = { test: 'This is a simple test' };
    function modifyTest(x){
        x.test = 'modified test text';
    }
    modifyTest(o);
    console.log(o.test);   // modified test text
    

    您甚至可以传入要修改的属性的名称

    var o = { test: 'This is a simple test' };
    function modifyTest(x, name){
        x[name] = 'modified test text';
    }
    modifyTest(o, 'test');
    console.log(o.test);    // modified test text
    

    【讨论】:

    • 我的问题是我需要传入变量,因为想要修改一个“静态”变量真的没有意义,它应该是动态的。
    • 我不认为您在正确的上下文中使用了“静态”和“动态”这两个词。您的意思是您希望能够按名称修改任何变量。如果这是你的目标,你应该看看我的第二个例子,使用一个对象并修改它的一个参数。没有办法按照你的要求去做,这就是应该的。
    • 但是对象示例很有趣,也许我可以更改我的代码以使用对象,以便我可以完成此操作。
    • 您可以通过 Sweet.js (sweetjs.org) 之类的方式查看 JavaScript 中的宏,但我可能会先尝试重新考虑您的问题。
    • 另一种欺骗变量可见性/范围的方法是返回引用局部变量的函数。这是在 Javascript 中获取私有变量的常用方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2015-10-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多