闭包中的Javascript实例化。如何使工厂和模型独立?
这是一个浏览器。Js代码示例非常简单 案例1:闭包中的Javascript实例化。如何使工厂和模型独立?,javascript,closures,Javascript,Closures,这是一个浏览器。Js代码示例非常简单 案例1: var settingsImportantPrefix={ 基本属性:1 }; var模型=函数(){ var self=这个; self.getA=函数(){ 返回settings.primitiveProperty; } }; var工厂=功能(设置){ 返回(功能(设置){ 返回新模型(); }(设置); } var测试=工厂(设置SimPortantPrefix); test.getA()它是不同的,因为有不同的作用域。当你调用一个函数时
var settingsImportantPrefix={
基本属性:1
};
var模型=函数(){
var self=这个;
self.getA=函数(){
返回settings.primitiveProperty;
}
};
var工厂=功能(设置){
返回(功能(设置){
返回新模型();
}(设置);
}
var测试=工厂(设置SimPortantPrefix);
test.getA()代码>它是不同的,因为有不同的作用域。当你调用一个函数时,它不会继承调用它的代码的作用域,而是在创建它时得到它的作用域
这可以更简单地表示出来;这将不起作用,因为变量a
不在创建函数show
的范围内:
function show() {
console.log(a);
}
function caller() {
var a = 1;
show();
}
function caller() {
var a;
function show() {
consle.log(a);
}
a = 1;
show();
}
这是因为变量a
在创建函数show
的范围内:
function show() {
console.log(a);
}
function caller() {
var a = 1;
show();
}
function caller() {
var a;
function show() {
consle.log(a);
}
a = 1;
show();
}
这也是可行的,因为变量a
位于创建函数show
的范围内,并且不需要位于调用函数的范围内:
function creator() {
var a = 1;
function show() {
console.log(a);
}
return show;
}
var showFunc = creator();
showFunc();
这是不同的,因为有不同的作用域。当你调用一个函数时,它不会继承调用它的代码的作用域,而是在创建它时得到它的作用域
这可以更简单地表示出来;这将不起作用,因为变量a
不在创建函数show
的范围内:
function show() {
console.log(a);
}
function caller() {
var a = 1;
show();
}
function caller() {
var a;
function show() {
consle.log(a);
}
a = 1;
show();
}
这是因为变量a
在创建函数show
的范围内:
function show() {
console.log(a);
}
function caller() {
var a = 1;
show();
}
function caller() {
var a;
function show() {
consle.log(a);
}
a = 1;
show();
}
这也是可行的,因为变量a
位于创建函数show
的范围内,并且不需要位于调用函数的范围内:
function creator() {
var a = 1;
function show() {
console.log(a);
}
return show;
}
var showFunc = creator();
showFunc();
首先-在第一种情况下,示例的输出是错误的-第一种情况会生成1
,而不是您编写的undefined
但是,尽管它们的输出相同,但两者之间存在差异。
函数内部使用的变量范围是在定义函数时确定的,而不是在使用函数时确定的
在第一种情况下-正在使用的设置对象是全局设置
变量,而在第二种情况下-正在使用的设置
变量是局部变量。但是,由于JavaScript中的对象是通过引用传递的,因此最终使用的是同一个变量(更改设置的值。primitiveProperty
将在两种情况下更改输出。首先-第一种情况下示例的输出错误-第一种情况下生成1
,而不是编写时生成未定义的
但是,尽管它们的输出相同,但两者之间存在差异。
函数内部使用的变量范围是在定义函数时确定的,而不是在使用函数时确定的
在第一种情况下-使用的设置对象是全局设置变量,而在第二种情况下-使用的设置变量是局部变量。但是,由于JavaScript中的对象是通过引用传递的,因此最终使用的是同一个变量(更改设置的值。primitiveProperty
将在这两种情况下更改输出。两种情况都有输入参数。我已更新了代码。确定后,两种情况都将生成1-第一种情况的输出不是未定义的
两种情况都有输入参数。我已更新了代码。确定后,两种情况都将生成1-第一种情况的输出输出不是undefined
这两个代码在浏览器中都可以正常工作(前提是首先包含包含Model()
的文件,否则它是未定义的)。它在node.js中不能像您期望的那样工作(第一个示例输出未定义),因为在node.js中,每个文件都有自己的上下文(包装在闭包中)为什么闭包不创建自己的作用域来获取值?您是指node.js还是指浏览器?在浏览器的情况下,如果您看到的是您看到的内容,则是因为包含Model()的文件
是在其余代码执行后包含的,因此当代码执行时,模型
是未定义的。如果您指的是node.js,那是因为每个文件都是它自己单独的闭包,因此可以防止文件中的变量污染其他文件的范围。我已经澄清了工厂和模型的用法。现在任务是semms更清楚一点。啊。好吧。我现在明白了。对不起,我误解了/误读了这个问题。Guffa的回答是正确的:因为设置是工厂的闭包的一部分,而不是模型的闭包的一部分。我想你误解了闭包是什么。闭包和范围几乎是一样的。如果有一件事是错的对于作用域,它也超出了闭包。作用域类似于类,闭包类似于对象。闭包是作用域的实例。这两种代码在浏览器中都可以正常工作(前提是首先包含包含Model()
的文件,否则它是未定义的)。它在node.js中的工作方式与您期望的不同(第一个示例输出未定义)因为在node.js中,每个文件都有自己的上下文(包装在闭包中),为什么闭包不创建自己的作用域来获取值?您是指node.js还是指浏览器?在浏览器中,如果您看到的是您看到的内容,则是因为包含Model()的文件
是在其余代码执行后包含的,因此当代码执行时,模型
是未定义的。如果您指的是node.js,那是因为每个文件都是它自己单独的闭包,因此可以防止文件中的变量污染其他文件的范围。我已经澄清了工厂和模型的用法。现在任务是semms更