Zhe*_*heX 1 html javascript scripting
我无法让我的javascript函数工作.
if (!cHp) { cHp = 200 };
Run Code Online (Sandbox Code Playgroud)
像魅力一样,但是
function checkNull(x, y) {
if (!x) { x = y; }
}
Run Code Online (Sandbox Code Playgroud)
根本不起作用.
我究竟做错了什么?
它确实有效,但它对你没有任何好处,因为JavaScript纯粹是按值调用.这意味着在您的函数中,参数"x"和"y"包含调用环境中存在的值的副本.
从而,
checkNull(b, 2 + 17);
Run Code Online (Sandbox Code Playgroud)
导致变量"b"的值和要传递给函数的数字19的副本.该函数可以对"x"和"y"执行任何操作,但这对调用上下文中的变量"b"没有任何影响.
编辑 - 可以扩展这个主题并切断过长的评论主题,让我们谈谈"按值调用"(以及相反,"按引用调用")的含义.在按值调用参数传递方案中,调用环境中的实际参数值被复制到被调用函数的参数变量中.在逐个引用调用方案中,对调用环境中某种变量的引用被传递给被调用函数.这两个有什么不同?
在按值调用方案中,会发生以下情况:
var a = 1;
function change(b) {
b = 2;
}
change(a);
alert(a); // still 1
Run Code Online (Sandbox Code Playgroud)
但是,在逐个引用的方案中,这是正确的:
// FANTASY CODE - NOT REAL JAVASCRIPT
var a = 1;
function change(b) {
b = 2;
}
change(a);
alert(a); // it is 2 in this fantasy call-by-reference code
Run Code Online (Sandbox Code Playgroud)
注意,引用调用方案的一个含义是调用环境中的实际参数必须是变量或对象属性或其他东西; 也就是说,它必须是编程语言术语中所谓的"l值".另一种说法是,它必须是可以出现在赋值表达式左侧的东西.
事情变得有点混乱,因为JavaScript中的变量将对象视为"价值".将对象分配给变量时:
var myObj = {};
Run Code Online (Sandbox Code Playgroud)
你真的在分配对象的引用.这在JavaScript中是完全透明的,你真的不需要考虑它.Juggling对象值与JavaScript中的原始值一样简单.但是,这意味着当一个对象值传递给一个函数时,该变量的实际值是对该对象的引用这一事实意味着JavaScript的call-by-value语义看起来类似于一个call-by - 参考方案:
var a = { property: 1 };
function change(b) {
b.property = 2;
}
change(a);
alert(a.property); // it's 2!! OMG call-by-reference! (not)
Run Code Online (Sandbox Code Playgroud)
是的,函数可以修改作为参数传递的对象的属性值.这是参考电话吗? 不,它不是,至少不是如果你关心"引用号召"这个词的含义.即使该函数可以更改"属性"属性的值,它仍然无法更改"a"本身的值! 这就是所谓的引用方式.
目前很少见到其他参数传递方案.一说是种-的迷人的是"调用 - 名为"从ALGOL 60什么是计划所做的是把实际的参数排序的像一个隐函数,使得调用函数的参数的引用将重新评估参数表达式.还有"按值调用/结果",这意味着实际参数是通过值传递的,但是当函数返回时,函数中当前参数的值被隐式复制回调用中的源变量环境.(该方案还要求实际参数为l值,例如逐个引用.)