- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我注意到人们到处都提到“只要在你的 JS 代码顶部定义一个变量,它就变成了全局变量”来回答诸如“我如何从函数内部创建一个全局变量?”。大多数答案一开始就说不可能实现。当然可以这样做:
<script type="text/javascript">
window.spam = 'Hello World';
</script>
然后,稍后在您的代码中,您可以说:
<script type="text/javascript">
alert(spam);
</script>
这在 IE6+、Firefox、Chrome、Safari 等中工作得很好。那么为什么没有人这样做呢?
在我的例子中,我希望人们从他们的代码和我的 AJAX 库中的任何地方访问一个名为 fooBar
的全局变量,我希望该变量在幕后自动更新,以便当他们说 $.do_some_magic()
他们可以确定 fooBar
将反射(reflect) $.do_some_magic()
所做的更改,而无需考虑它。我不希望他们必须在他们的代码中创建变量,我也不希望在我的库代码中创建变量。我想我只是讨厌在顶部定义全局变量,除非有充分的理由不这样做,否则宁愿不这样做。有吗?
最佳答案
清晰度
这是一种明确的方式,表明您打算创建一个全局变量。
// Unclear: Intentional, or accident
function privateScope() {
spam = "hello";
function globalFunction() {
}
}
这将使一个变量成为全局变量,因为它是以这种方式声明的,尽管程序员打算让变量和函数具有全局范围并不是很明显。
// Clear: Intentional global use
function privateScope() {
window.spam = "hello";
window.globalFunction = function () {
}
}
这个例子比较明显。
最佳实践
如果您提前知道一个变量将在全局范围内使用,那么它应该在您的文件顶部声明,在您的所有函数之外:
var spam;
如果您在自执行匿名函数中,则显式使用 window.spam
:
(function(){
// currently private to this scope
var spam;
... lots of code ...
// Expose the variable publically
window.spam = spam;
})();
名称冲突
anthares brought up另一方面,名称冲突
许多库公开了一个顶级对象。您可以构造一个函数来执行此操作,也可以使用简单的对象文字作为命名空间:
(function(){
// Expose a single top level variable
window.YourCompany = { };
// Private:
var spam = "name";
... other code ...
// Make public
window.YourCompany.spam = spam;
})();
关于JavaScript:window.spam 是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218582/
在我生活的世界中,构建一个将所有飞镖都扔到墙上的解决方案,并希望其中一些能命中靶心是一种非常糟糕的解决方案方法。 那么,我的问题出现了,什么时候在约定可接受的生产系统中使用 INSERT IGNORE
在数据处理时,经常会因为index报错而发愁。不要紧,本次来和大家聊聊pandas中处理索引的几种常用方法。 1.读取时指定索引列 很多情况下,我们的数据源是 CSV 文件。假设
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我是一名优秀的程序员,十分优秀!