Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数返回未声明的变量_Javascript_Variables_Knockout.js_Function Declaration - Fatal编程技术网

Javascript 函数返回未声明的变量

Javascript 函数返回未声明的变量,javascript,variables,knockout.js,function-declaration,Javascript,Variables,Knockout.js,Function Declaration,我最近在knockout库的代码中进行了搜索,以发现当我们调用它时,可观察对象如何能够创建与计算函数的依赖关系 在源代码中,我找到了与创建可观察对象相关的函数: ko.observable = function (initialValue) { var _latestValue = initialValue; function observable() { if (arguments.length > 0) { // Write

我最近在knockout库的代码中进行了搜索,以发现当我们调用它时,可观察对象如何能够创建与计算函数的依赖关系

在源代码中,我找到了与创建可观察对象相关的函数:

ko.observable = function (initialValue) {
    var _latestValue = initialValue;

    function observable() {
        if (arguments.length > 0) {
            // Write

            // Ignore writes if the value hasn't changed
            if (observable.isDifferent(_latestValue, arguments[0])) {
                observable.valueWillMutate();
                _latestValue = arguments[0];
                if (DEBUG) observable._latestValue = _latestValue;
                observable.valueHasMutated();
            }
            return this; // Permits chained assignments
        }
        else {
            // Read
            ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation
            return _latestValue;
        }
    }
    ko.subscribable.call(observable);
    ko.utils.setPrototypeOfOrExtend(observable, ko.observable['fn']);

    if (DEBUG) observable._latestValue = _latestValue;
    observable.peek = function() { return _latestValue };
    observable.valueHasMutated = function () { observable["notifySubscribers"](_latestValue); }
    observable.valueWillMutate = function () { observable["notifySubscribers"](_latestValue, "beforeChange"); }

    ko.exportProperty(observable, 'peek', observable.peek);
    ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated);
    ko.exportProperty(observable, "valueWillMutate", observable.valueWillMutate);

    return observable;
}
我认为非常奇怪的是“可观察”的返回,我没有发现这个变量的任何声明。当然,创建这个图书馆的伟人不会忘记宣布它

如何在不声明变量的情况下使用变量并防止将其放入全局范围

我的感觉是,当这个函数声明在另一个函数中声明时,我们可以使用函数声明作为变量,但我真的不确定它是如何工作的

编辑: 在网上搜索后,我找到了这个

在这篇文章中,这家伙写道:

请使用声明 “在没有经验的开发人员的代码中,函数通常由表达式声明:

…代码…var f=function(){…}。。。 函数声明更具可读性和更短。请改用它们

…代码…函数f(){…}。。。 此外,可以在定义之前调用以这种方式声明的函数

仅在您有意的情况下使用表达式。例如,用于条件函数定义。“


好的,我是一个没有经验的开发人员吗?我不这么认为。我只是不了解Javascript的所有可能性。:)

可观察的
是一个变量。它是由一个


在Javascript中,还可以返回函数。在函数中,他定义了在函数末尾返回的“可观察”函数


可以说,函数也是变量。有一个函数在里面。

我一直认为函数声明可以被调用,但不能作为变量使用。我的意思是,你声明一个函数,然后调用它。或者您声明了一个变量并为其赋值函数声明,该函数声明将创建一个函数声明,然后返回该变量。但在所有情况下,都不能像变量那样简单地使用函数声明。奇怪…@Samuel Nope,函数都只是可以分配给变量的值,不管它们是如何声明的。关于命名函数的唯一特别注意事项是它们的提升方式(请参见)。@LightnessRaceInOrbit
observable
named
valueHasMutated
的属性由以
observable.valueHasMutated=…
@ChrisMartin:哦,是的,是的。这段代码读起来有点奇怪。文章的作者在《无经验开发人员的代码》(code of unexperienced developers)中说,
,似乎有点自卑感,或者其他什么,他试图证明自己的经验和智慧水平
var f=function(){}
function f(){}
都是有效的,它们都有各自独特的优缺点。但是,如果说一种语法只存在于
没有经验的
开发人员的代码中,而另一种语法是
正确的
函数声明方式,那就太愚蠢了。Javascript是一种非常特殊的语言,所以很容易成为一个有经验的开发人员,但对Javascript没有经验。不过,就JS开发人员而言,这并不是一种特别晦涩的风格。对我来说,有一个强烈的偏好这样或那样表明对语言的不适程度
var f=function(){}
受到那些不习惯隐式提升的人的喜爱,而
function f(){}
则受到那些不习惯将函数视为值的人的青睐。过了一会儿,你甚至看不到代码。我看到的只有金发,黑发,红发。。。
function observable() {
    ...
}