JavaScript函数声明选项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaScript函数声明选项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3674字,纯文字阅读大概需要6分钟。
内容图文
我见过专家在下面使用声明函数:
(function () {
function f(n) {
// Format integers to have at least two digits.
return n < 10 ? '0' + n : n;
}
//etc
}());
例如
https://github.com/douglascrockford/JSON-js/blob/master/json.js
有人可以帮助我了解何时应使用上述模式以及如何使用它吗?
谢谢.
解决方法:
好吧,由于ECMA6尚未到来,因此功能是在JS中创建作用域的最佳方法.如果将各种类型的变量声明包装在IIFE(立即调用函数表达式)中,则不会全局创建该变量.函数声明也是如此.
如果您要清除所有全局变量的脚本看似艰巨,那么您需要做的就是将整个脚本包装在一个简单的(function(){/ * script here * /}());中,创建了globals,以免它们成为隐含的??globals,但这只是一个懒惰的解决方法.这种模式非常强大.
我已经详细解释了IIFE的用法,包括here、here和here
基本的JS函数调用实时循环的工作方式如下:
f();//call function
||
====> inside function, some vars are created, along with the arguments object
These reside in an internal scope object
==> function returns, scope object (all vars and args) are GC'ed
像JS中的所有对象一样,一旦不再引用该对象,该对象就会被标记为GC(垃圾回收).但是请考虑以下几点:
var foo = (function()
{
var localFoo = {bar:undefined};
return function(get, set)
{
if (set === undefined)
{
return localFoo[get];
}
return (localFoo[get] = set);
}
}());
当IIFE返回时,为foo分配了它的返回值,这是另一个函数.现在,localFoo在IIFE的范围内声明,并且无法直接访问该对象.乍一看,您可能希望对localFoo进行GC处理.
但是请放心,正在返回的函数(并分配给foo的函数仍然引用该对象,因此无法对其进行gc’ed.换句话说:作用域对象在函数调用之后失效,并创建了一个闭包.
这样,直到变量foo超出范围或被重新分配了另一个值并且对返回的函数的所有引用都丢失之后,才会对localFoo对象进行GC处理.
看一下其中一个链接的答案(带有图表的答案),在那个答案中有一个指向文章的链接,我从那里偷了我使用的图像.如果还没有,那应该为您清除一切.
IIFE不能返回任何内容,但是可以公开其范围,无论如何:
var foo = {};
(function(obj)
{
//obj references foo here
var localFoo = {};
obj.property = 'I am set in a different scope';
obj.getLocal = function()
{
return localFoo;
};
}(foo));
此IIFE不返回任何内容(隐含未定义),但console.log(foo.getLocal())将记录空对象文字. foo本身也将被分配属性.但是,等等,我可以为您做得更好.假设foo已经通过上述代码传递了一次:
var bar = foo.getLocal();
bar.newProperty = 'I was added using the bar reference';
bar.getLocal = function()
{
return this;
};
console.log(foo.getLocal().newProperty === bar.newProperty);
console.log(bar ==== foo.getLocal());
console.log(bar.getLocal() === foo.getLocal().getLocal());
//and so on
这将记录什么?确实,它将一次又一次地记录真实时间.对象永远不会在JS中复制,它们的引用也会被复制,但是对象始终是相同的.在某个范围内对其进行一次更改,这些更改将在逻辑上在所有引用之间共享.
这只是为了向您展示闭包起初可能很难使您大开眼界,但这也显示了闭包的强大之处:您可以通过各种IIFE传递对象,每次设置可以访问其自身的新方法,其他方法无法达到的独特范围.
注意
JS引擎对Garbage Collect而言,关闭器并不是那么容易,而是lately, that’s not that big of an issue anymore.
另外,请花些时间来搜索以下条款:
> JavaScript Some reasons WHY we use it中的模块模式
> JavaScript Second hit中的闭包
> JavaScript功能范围First hit
> JavaScript函数上下文The dreaded this reference
IIFE也可以命名为函数,但是唯一可以引用该函数的地方是该函数的作用域内:
(function init (obj)
{
//obj references foo here
var localFoo = {};
obj.property = 'I am set in a different scope';
obj.getLocal = function()
{
return localFoo;
};
if (!this.wrap)
{//only assign wrap if wrap/init wasn't called from a wrapped object (IE foo)
obj.wrap = init;
}
}(foo));
var fooLocal = foo.getLocal();
//assign all but factory methods to fooLocal:
foo.wrap(fooLocal);
console.log(fooLocal.getLocal());//circular reference, though
console.log(init);//undefined, the function name is not global, because it's an expression
这只是如何使用闭包创建包装对象的一个??基本示例.
内容总结
以上是互联网集市为您收集整理的JavaScript函数声明选项全部内容,希望文章能够帮你解决JavaScript函数声明选项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。