Javascript 函数返回未声明的变量
我最近在knockout库的代码中进行了搜索,以发现当我们调用它时,可观察对象如何能够创建与计算函数的依赖关系 在源代码中,我找到了与创建可观察对象相关的函数: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
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
namedvalueHasMutated
的属性由以observable.valueHasMutated=…
@ChrisMartin:哦,是的,是的。这段代码读起来有点奇怪。文章的作者在《无经验开发人员的代码》(code of unexperienced developers)中说,,似乎有点自卑感,或者其他什么,他试图证明自己的经验和智慧水平var f=function(){}
和function f(){}
都是有效的,它们都有各自独特的优缺点。但是,如果说一种语法只存在于没有经验的开发人员的代码中,而另一种语法是正确的函数声明方式,那就太愚蠢了。Javascript是一种非常特殊的语言,所以很容易成为一个有经验的开发人员,但对Javascript没有经验。不过,就JS开发人员而言,这并不是一种特别晦涩的风格。对我来说,有一个强烈的偏好这样或那样表明对语言的不适程度var f=function(){}
受到那些不习惯隐式提升的人的喜爱,而function f(){}
则受到那些不习惯将函数视为值的人的青睐。过了一会儿,你甚至看不到代码。我看到的只有金发,黑发,红发。。。
function observable() {
...
}