Javascript隐藏上下文

Javascript隐藏上下文,javascript,node.js,Javascript,Node.js,方法调用另一个方法并以非引用方式传递参数的最佳方式是什么 i、 e 我意识到我可以克隆上下文并传递它。但我想知道是否还有其他方法可以做到这一点,也许是使用匿名函数wrap?这是因为您不是从技术上重新定义x,而是向其添加属性。我真的不明白您的疑问来自何处,所以(据我所知)这是对您的代码所做工作的解释 我会试着把代码翻译成人类英语 在“全局范围”中定义变量上下文。(可以从任何地方读取) 无法重新定义它,因为它是一个常量 然后,定义一个匿名自调用函数(它在全局作用域之上“启动”一个新的“本地作用域”,

方法调用另一个方法并以非引用方式传递参数的最佳方式是什么

i、 e


我意识到我可以克隆
上下文
并传递它。但我想知道是否还有其他方法可以做到这一点,也许是使用匿名函数wrap?

这是因为您不是从技术上重新定义x,而是向其添加属性。

我真的不明白您的疑问来自何处,所以(据我所知)这是对您的代码所做工作的解释

我会试着把代码翻译成人类英语

在“全局范围”中定义变量
上下文
。(可以从任何地方读取)
无法重新定义它,因为它是一个常量

然后,定义一个匿名自调用函数(它在全局作用域之上“启动”一个新的“本地作用域”,这样它就可以访问全局作用域可以访问的所有内容)

此自调用函数获取参数
x
,并将值为
true
的属性
y
添加到
x
,并使用变量
上下文调用自身

读取
上下文的值

请阅读:

  • (自调用函数)

好的,让我们把它分解一下

const context = {x: true};
上面,您将在全局范围中创建一个对象(命名上下文)

function(x) {
    "use strict";
    x.y = true;
}
创建一个匿名函数,该函数引用一个对象,并向该对象添加一个新属性
y

(/*...*/)(context);
您将上述函数包装到IIFE中,使其立即执行。对于参数,您提供了对全局
上下文
对象的引用,该对象由IIFE中的
x
引用

对象通过引用传递。将
context
传入函数不会创建一个新对象
x
,它是
上下文的副本,而是创建一个新引用
x
,该引用引用与
上下文
引用的对象相同

如果需要将提供的对象复制到新对象中,则需要自己完成。如上所述,一种机制是将对象字符串化为JSON,然后将JSON解析回一个新对象。还有一些取决于你需要完成什么

这甚至不是一个范围或上下文问题,而是将对对象的引用传递给函数。即使您的iLife无法直接访问
上下文
变量,但一旦您将对该对象的引用作为函数的输入传递给函数,该函数就拥有该引用并可以对其执行它喜欢的操作

你似乎也误解了IIFE是如何隐藏数据的。你把生活中的东西藏在里面,而不让生活中的东西藏在外面,反之亦然。即使这样,它也不会阻止你在生活之外传递参考。下面是一个例子:

function changeName(animal) {
    "use strict"
    //myDog.name = "Rex"; // Error - myDog isn't a valid reference in this scope
    //myCat.name = "Rex"; // Error - myCat isn't a valid reference in this scope either 
    animal.name = "Rex";  // Perfectly legal
}

(function () {
    var myDog = {name: "Rover"};
    var myCat = {name: "Kitty"};

    console.log(myDog);
    console.log(myCat);
    changeName(myDog);  // Even though changeName couldn't directly access myDog, if we give it a reference, it can do what it likes with it.
    console.log(myDog);
})()

在这种情况下,
changeName
无法访问纯粹包含在IIFE形成的闭包中的
myDog
myCat
。但是,该IIFE中存在的代码能够将对myDog的引用传递给changeName,并允许它更改dog的名称,即使changeName仍然无法使用
myDog
变量访问对象。

它为什么会产生
{x:true}
?@AndrewLi,因为我以为上下文会被分离,但您正在传入一个对象并修改它?为什么不修改呢?好吧,那么让我重新表述一下:我如何将父上下文与子上下文分离?你说的“父”和“子”是什么意思?我认为匿名函数的全部目的是分离上下文。如果你想分离上下文,你可以使用子对象,例如context={x:{x:true},y:{y:true},然后执行context.x或context.y
function changeName(animal) {
    "use strict"
    //myDog.name = "Rex"; // Error - myDog isn't a valid reference in this scope
    //myCat.name = "Rex"; // Error - myCat isn't a valid reference in this scope either 
    animal.name = "Rex";  // Perfectly legal
}

(function () {
    var myDog = {name: "Rover"};
    var myCat = {name: "Kitty"};

    console.log(myDog);
    console.log(myCat);
    changeName(myDog);  // Even though changeName couldn't directly access myDog, if we give it a reference, it can do what it likes with it.
    console.log(myDog);
})()