通过值或引用复制/传递js中的函数
Functions in js copied/passed by value or reference
我知道Javascript中的对象是通过引用复制/传递的。但是函数呢?
我正在尝试这个代码,突然发现了一些令人困惑的东西。以下是代码片段:
x = function() { console.log('hey 1'); }
y = x;
x = function() { console.log('hey 2'); }
y; // Prints function() { console.log('hey 1'); }
如果像对象这样的函数是通过引用复制/传递的,为什么y没有更新为打印"嘿2"?
如果这种行为是因为"x"被分配了一个全新的函数,那么当x发生变化时,变量"y"有没有办法分配给新分配的函数?
JS中的所有内容都是传递值,其中对象和函数的值是引用。
这里发生的事情与对象发生的事情相同(因为函数只是一级对象):
以下是发生的事情的要点:
x = function() { console.log('hey 1'); }
x
指向function() that logs 1
(为该功能创建内存)
y = x;
y
指向function() that logs 1
(相同存储位置)
x = function() { console.log('hey 2'); }
x
现在指向新的function() that logs 2
(一个新的内存空间),通过没有影响y
y;
y
仍然指向相同的function() that logs 1
如果您想让对x
的更改影响y
,您应该做的是更改它们所指向的东西,而不是更改它们所指的东西。
例如:
var pointingAtMe = { log: function() { console.log('1'); } }
var x = pointingAtMe;
var y = pointingAtMe;
// change the actual thing x and y are both pointing to
x.log = function() { console.log('2'); } // this line also sets `y.log` and `pointingAtMe.log`since they all point to the same thing
// and the change gets applied to both
y.log(); // logs '2'
如果像对象这样的函数是通过引用复制/传递的,为什么y没有更新为打印"嘿2"?
你在做错误的假设。在JavaScript中,一切都是通过值传递的。对象被表示为引用是正确的,但这与逐引用传递不同。
即使你使用了一个普通的对象而不是函数,你也看不到你所期望的:
var x = {foo: 42};
var y = x;
x = {foo: 21};
console.log(y.foo); // still 42
传递值/引用仅描述如何解析变量和参数,与变量的值无关。
如果这种行为是因为"x"被分配了一个全新的函数,那么当x发生变化时,变量"y"有没有办法分配给新分配的函数?
没有。没有明确分配给y
。
x = function() { console.log('hey 2'); }
没有更改x变量中包含的对象,而是修改了x变量的内容。
- 将复杂对象从angular js传递到web api,它总是返回404
- 如何将一个*参数*从JS传递到AS3
- 将一个php变量从js传递到php,并返回内容问题
- 如何将chrome.tabCapture流从js传递到c++PNACL本机代码
- 在GoogleWebApp脚本中,Cant似乎无法将多个参数从JS传递到HTML
- 使用Express4将数组从Nodejs中的app.js传递到routes/index.js
- Chrome 打包应用 - 消息从后台传递.js传递到另一个脚本页面
- 将值 fron conf.js 传递给咕噜咕噜的任务或在咕噜咕噜的任务之间传递
- 使用 vent.js 传递参数.如何在触发事件后加载的下一个页面视图中读取该数据
- 反应.js传递参数时路由器不在 URL 中
- 使用 AJAX 调用将数组变量从 JS 传递到 PHP
- 键入提前.js传递动态附加参数
- 从JS传递变量并在PHP中使用它不起作用
- Ember.js传递动态段的方法
- 节点.js传递回调
- 如何在没有jquery的情况下将JavaScript变量从一个JS传递到另一个JS
- 无法将 int 从 JS 传递到 Chrome NPAPI 插件
- 反应.js传递对象键值对作为 props
- 将变量从 js 传递到轨道视图而不刷新页面
- 将变量从 JS 传递到 PHP