Javascript如果只在函数外工作

时间:2013-04-24 13:40:39

标签: javascript html scripting

我无法使用我的javascript函数。

if (!cHp) { cHp = 200 };

像魅力一样,但

function checkNull(x, y) {
if (!x) { x = y; }
}

根本不起作用。

我做错了什么?

2 个答案:

答案 0 :(得分:7)

它确实有效,但它对你没有任何好处,因为JavaScript纯粹是按值调用。这意味着在您的函数中,参数“x”和“y”包含调用环境中存在的值的副本

因此,

checkNull(b, 2 + 17);

导致变量“b”的值和数字19的副本传递给函数。该函数可以对“x”和“y”执行任何操作,但这对调用上下文中的变量“b”没有任何影响。

编辑 - 确定要扩展此主题并切断过长的评论主题,让我们谈谈“按价值调用”的内容(并且,相比之下,“呼叫 - 通过 - 参考“)意思是。在按值调用参数传递方案中,调用环境中的实际参数值被复制到被调用函数的参数变量中。在逐个引用调用方案中,对调用环境中某种变量的引用被传递给被调用函数。这两者有何不同?

在按值调用计划中,会发生以下情况:

var a = 1;
function change(b) {
  b = 2;
}

change(a);
alert(a); // still 1

然而,在逐个参考方案中,这是真的:

// 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

请注意,引用调用方案的一个含义是调用环境中的实际参数必须是变量或对象属性或其他内容;也就是说,它必须是编程语言术语中所谓的“l值”。另一种说法是,它必须是可以出现在赋值表达式左侧的东西。

由于JavaScript中的变量将对象视为“价值”,因此事情变得有些混乱。将对象分配给变量时:

var myObj = {};

您确实正在为对象分配引用。这在JavaScript中是完全透明的,你真的不需要考虑它。 Juggling对象值与JavaScript中的原始值一样简单。但是,这意味着当一个对象值传递给一个函数时,该变量的实际值是对象的引用这一事实意味着该调用JavaScript的-by-value语义看起来类似于call-by-reference方案:

var a = { property: 1 };
function change(b) {
  b.property = 2;
}

change(a);
alert(a.property); // it's 2!! OMG call-by-reference! (not)

是的,函数可以修改作为参数传递的对象的属性值。这是参考电话吗? ,不是,至少如果您关心“引用号召”这个术语的含义是什么。即使该函数可以更改“property”属性的值,仍然无法更改“a”本身的值!这就是所谓的引用调用。

现在很少见到其他参数传递方案。令人着迷的是来自ALGOL 60的“call-by-name”。该方案的作用是将实际参数排序 - 类似于隐式函数,这样在被调用函数中对参数的引用将重新评估参数表达式。还有“按值调用/结果”,这意味着实际参数是通过值传递的,但是当函数返回时,函数中当前参数的值被隐式复制回调用中的源变量环境。 (该方案还要求实际参数为l值,如逐个引用。)

答案 1 :(得分:0)

您需要做的是让函数返回一个值并将返回值赋给变量。尝试这样的事情:

var checkNull = function (x, y) {
        if (!x) {
            return y;
        }
        return x;
    },
    cHp,
    testVar;

cHp = checkNull(testVar, 200);  // will return 200 since testVar is undefined

testVar = 100;

cHp = checkNull(testVar, 200);  // will return 100 since testVar is defined