javascript框架如何拥有自己的工作空间?
可能重复:javascript框架如何拥有自己的工作空间?,javascript,Javascript,可能重复: 在过去的几天里,我一直对Javascript框架如何拥有自己的工作区很感兴趣,我的意思是,他们如何能够调用任意名称的变量,并且在不涉及局部变量的情况下使用它 我现在正在编写一个API,我面临着局部变量/函数局部名称的问题,如果它们已经存在的话 所以,我所做的是研究框架是如何工作的,我看到他们使用了如下名称空间函数: (function(){ .... })() 所以我试着做一些相似的事情 <html> <head> <script ty
在过去的几天里,我一直对Javascript框架如何拥有自己的工作区很感兴趣,我的意思是,他们如何能够调用任意名称的变量,并且在不涉及局部变量的情况下使用它 我现在正在编写一个API,我面临着局部变量/函数局部名称的问题,如果它们已经存在的话 所以,我所做的是研究框架是如何工作的,我看到他们使用了如下名称空间函数:
(function(){ .... })()
所以我试着做一些相似的事情
<html>
<head>
<script type="text/javascript">
(function() {
function f(toAlert) { alert(toAlert); }
})();
</script>
</head>
<body>
<script>
toAlert("hi");
</script>
</body>
</html>
(功能(){
函数f(toAlert){alert(toAlert);}
})();
toAlert(“你好”);
但它不起作用
因此,我有几个问题:
当然,它不起作用,因为您的
f(toAlert)
函数只在立即执行的函数闭包范围内可见。您还试图调用一些一开始就不存在的函数。您的闭包函数被称为f
(并且具有toAlert
参数),然后您尝试调用名为toAlert
的函数,该函数在任何地方都没有定义。不在全局范围内,也不在关闭范围内
范围
这段代码可能会帮你把事情弄清楚一点。阅读评论
<script type="text/javascript">
// global scope
function globalFunc(text) {
alert(text);
}
var privateFunc = null;
// function closure scope
(function(){
// closure function
function closureFunc(text) {
// can call global
globalFunc(text);
}
// let's make closure function accessible from global scope
// since privateFunc variable is in global scope
privateFunc = closureFunc;
})();
// call closure function
privateFunc("calling closure function");
// ERROR: this will not work due to function being in closure scope
closureFunc("calling closure function");
</script>
将其放在括号中,并在末尾添加一些,然后立即执行:
(function name(someParameter) { ... })("Parameter text value");
注意函数参数
为什么库使用局部作用域?
库通常使用局部范围来避免污染,更重要的是与其他可能的库发生冲突。考虑两个库,它们都定义了一个名为getName
的函数。最后一个定义它的库将简单地覆盖第一个库的实现,从而使第一个库发生故障
当每个库创建自己的闭包作用域时,它们可以在其中创建任何函数、变量并使用它们,而不用担心被重写。库通常只在全局范围内公开一些小部分,因此其他脚本可以实际使用库
(function() {
var closureVar = "I'm local";
globalVar = "I'm global";
// or
window.globalVar2 = "I'm global equivalent";
})();
省略
var
或引用window
对象会使函数或变量成为全局对象。当然它不起作用,因为您的f(toAlert)
函数仅在立即执行的函数闭包范围内可见。您还试图调用一些一开始就不存在的函数。您的闭包函数被称为f
(并且具有toAlert
参数),然后您尝试调用名为toAlert
的函数,该函数在任何地方都没有定义。不在全局范围内,也不在关闭范围内
范围
这段代码可能会帮你把事情弄清楚一点。阅读评论
<script type="text/javascript">
// global scope
function globalFunc(text) {
alert(text);
}
var privateFunc = null;
// function closure scope
(function(){
// closure function
function closureFunc(text) {
// can call global
globalFunc(text);
}
// let's make closure function accessible from global scope
// since privateFunc variable is in global scope
privateFunc = closureFunc;
})();
// call closure function
privateFunc("calling closure function");
// ERROR: this will not work due to function being in closure scope
closureFunc("calling closure function");
</script>
将其放在括号中,并在末尾添加一些,然后立即执行:
(function name(someParameter) { ... })("Parameter text value");
注意函数参数
为什么库使用局部作用域?
库通常使用局部范围来避免污染,更重要的是与其他可能的库发生冲突。考虑两个库,它们都定义了一个名为getName
的函数。最后一个定义它的库将简单地覆盖第一个库的实现,从而使第一个库发生故障
当每个库创建自己的闭包作用域时,它们可以在其中创建任何函数、变量并使用它们,而不用担心被重写。库通常只在全局范围内公开一些小部分,因此其他脚本可以实际使用库
(function() {
var closureVar = "I'm local";
globalVar = "I'm global";
// or
window.globalVar2 = "I'm global equivalent";
})();
省略
var
或引用window
对象会使函数或变量成为全局对象。脚本不起作用,因为函数f
是在另一个函数作用域(外部(function(){..})(
)内声明的,因此仅用于本地使用(在同一作用域内)。这实际上是使用这种结构的要点,而不是用遗留的函数和变量扰乱全局环境。脚本不起作用,因为函数f
是在另一个函数作用域(外部(function(){..})(
)内声明的,因此只供本地使用(在同一作用域内)。这实际上是使用这种结构的要点,而不是用遗留的函数和变量扰乱全局环境。没有toAlert
函数——这是函数f
的一个参数<但是,code>f不在立即执行的匿名函数的范围之外
如果你想公开
f
,你需要从匿名函数返回它,这样你就可以捕获并调用它。没有toAlert
函数——这是函数f
的一个参数<但是,code>f不在立即执行的匿名函数的范围之外
如果你想公开
f
你需要从匿名函数返回它,这样你就可以捕获并调用它。你调用的名称空间函数实际上被称为函数closuresClosures是函数返回内部函数的一般模式。(function(){}())的通常名称是模块pattern@Mor塞拉:你应该更新你原来的问题,而不是问一个新的onenamespace函数,因为你称它们为函数closuresClosures是函数返回内部函数的一般模式。(function(){}())的通常名称是模块pattern@Mor塞拉:你应该更新你原来的问题,而不是问一个新问题……而且没有toAlert