精华内容
下载资源
问答
  • 自执行函数

    2019-02-22 16:50:40
    函数基本概念: 函数声明:function box(){} 函数表达式:var box = function(){}; 匿名函数:function(){} 属于函数表达式  匿名函数的作用:如果将匿名函数赋值给一个变量,则声明了一个函数: var box= ...

    函数基本概念:

    函数声明:function box(){}

    函数表达式:var box = function(){};

    匿名函数:function(){} 属于函数表达式

        匿名函数的作用:如果将匿名函数赋值给一个变量,则声明了一个函数: var box= function(){};

                如果将匿名函数赋予一个事件则成为事件处理程序: box.addEventListener("click",function(){alert("aaa")});

                创建闭包:(function(){})()

    函数定义的三种方法:

      var box = function(){};

      function box(){}

      var box = new Function();

    函数声明和函数表达式的不同:

      js在进行预解析时函数声明会提升,而函数表达式必须js顺序执行到此函数代码时才会逐行解析

      函数表达式后面加括号可以立即执行函数,函数声明不可以,只能以fnName()的方式调用才行

    实例:

    box();
    function box(){
      alert("aaa"); 
    }

    函数自执行

    (function(a){
      alert(a); 
    })("123")
     
    //"123" 使用()运算符
     
    (function(a){
      alert(a); 
    }("123"))
     
    //"123" 使用()运算符
     
    !function(a){
      alert(a);
    }("123")

    在function前面加!、+、-、=都可以将函数声明转化为函数表达式,消除了js引擎识别函数声明和函数表达式的歧义,

    加()是最安全的方法,免得其他的和函数返回值进行运算

    不过这样的写法有什么用呢?

     

    javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,

    根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,

    “容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,

    所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。

     

    JQuery使用的就是这种方法,将JQuery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。

     

     

     

    展开全文
  • 匿名函数、自执行函数,自执行匿名函数和立即执行的函数表达式区别 今天在写代码的时候发现对自执行函数有点懵,便去查询资料。然后紧接着自执行匿名函数,立即执行函数,匿名函数一窝蜂的出来了,借此就好好谈谈这...

    匿名函数、自执行函数,自执行匿名函数和立即执行的函数表达式区别

    今天在写代码的时候发现对自执行函数有点懵,便去查询资料。然后紧接着自执行匿名函数,立即执行函数,匿名函数一窝蜂的出来了,借此就好好谈谈这几个函数的区别吧。

    匿名函数

    匿名函数比较好理解,顾名思义就是没有名字的函数

    //普通函数:此函数声明了一个名为a的函数。 
    function a(){
      return 1;  
    };
    //匿名函数:这时你会发现报错了
    function(){
    	 return 1;
    };
    

    这时你会发现单独运行一个匿名函数,由于不符合语法要求,会报错。解决方法:只需要用()把匿名函数包起来即可

    (function(){
    	 return 1;
    };)
    

    自执行函数,立即执行的函数

    在介绍这里之前,我们先聊一聊"自执行"这个说法,关于”自执行“每个人理解不一样,有人称他为:自动执行,也有称作:立即调用,在这里我比较认同另一种说法:立即调用的函数表达式。

    什么是自执行?

    我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。
    自执行函数,即定义和调用合为一体。

    //对于函数表达式,在后面加括号即可以让函数立即执行;例如下面这个函数,至于为什么加了括
    号就可以立即执行,我们可以这么理解,就是像f();这样写的话,函数 可以立即执行是没问题的
    ,我们在经常会用到,那么对于函数表达式来说,fn1就是对后面的匿名函数的一个引用,因此在
    后面的匿名函数后直接加括号,自然也就可以立即执行
        var f = function(){
            console.log("ss");
        }();
    

    自执行函数的其他几种写法

    我个人推荐第一种写法,好处是,能提醒阅读代码的人,这段代码是一个整体。

    //方法1:最前最后加括号
    (function(){
    	alert(1);
    }());
    
    //方法2:function外面加括号
    (function(){
    	alert(1);
    })();
    
    方法3:function前面加运算符,常见的是!与void 。
    !function(){
    	alert(1);
    }();
    void function(){
    	alert(2);
    }();
    
    

    在参考了多个网站总算将这些理念弄清楚一些。
    参考网址:
    http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html
    https://www.cnblogs.com/jessiespur/p/9283101.html
    https://www.jianshu.com/p/1d52ed86d52c

    展开全文
  • JS自执行函数:  (function(){ //这里为调用的其它代码 })(); Jquery立即执行函数: $(function(){ //这里为要调用的其它代码 }) 区别:第一个为顺序执行,即如果要调用其它的js方法,则需要置于代码...

    JS自执行函数: 

    (function(){
    	//这里为调用的其它代码
    })();
    

    Jquery立即执行函数:

    $(function(){
    	//这里为要调用的其它代码
    })

    区别:第一个为顺序执行,即如果要调用其它的js方法,则需要置于代码末尾。否则无法调用。

    第二个可以为全部代码加载后再执行,因此,如果第一个放在代码末尾,两者功能一样。

    展开全文
  • 自执行函数和闭包

    2019-04-04 18:42:29
    自执行函数和闭包自执行函数自执行函数的三种写法自执行函数的第一种写法:最前最后加括号自执行函数的第二种写法:function外面加括号自执行函数的第三种写法:在function前面加运算符,常用的是!和void自执行函数...

    自执行函数

    自执行函数的好处:匿名函数自执行里面的所有东西都是一个局部的。防止和其他的代码冲突

    自执行函数的四种写法

    自执行函数的第一种写法:最前最后加括号

    这种写法是jslint推荐的写法,可以让阅读者清楚的看到这是一个整体。

    注意:这种写法必须保证js代码的结尾处以封号结尾,不然会报Uncaught TypeError的错。

    (function(global, factory){
    	console.log(global+factory)
    }(1,2));//3
    

    自执行函数的第二种写法:function外面加括号

    第二种写法相比较第一种写法缺少了阅读的整体性。

    (function(global, factory){
    	console.log(global+factory)
    })(1,2);//3
    

    自执行函数的第三种写法:在function前面加运算符,常用的是!和void

    !function(global, factory){
    	console.log(global+factory)
    }(1,2)//3
    + function(global, factory){
    	console.log(global+factory)
    }(1,2)//3
    void function(global, factory){
        console.log(global+factory)
    }(1,2)//3
    

    自执行函数的第四种写法:new function

     new function(){
       console.log(1)
     }
     new function(a){
         console.log(a)
     }(1)//传递参数的情况
    

    访问自执行函数里面的变量

    如果直接调用自执行函数中的方法或者变量会报错,比如下面的代码会报:Uncaught ReferenceError: global is not defined。

    (function(global, factory){
    	var global, factory=3;
    }())
    console.log(global, factory)
    

    为了能正确的访问自执行函数中的变量,可以将对外提供的接口作为window的属性或者是方法

    (function(window,global, factory){
    	function getGlobalValue(){
    		return global
    	}
    	window.getGlobalValue=getGlobalValue
    }(window,2,3));
    console.log(getGlobalValue())//2
    

    注:在上述代码中记得传入window,因为在压缩时window既不是声明的局部变量也不是参数,所以不会被压缩混淆的,但是传入window是可以将其压缩混淆,而且传入window参数,就可以不用沿着作用域链一层层向上查找直到顶层作用域去获取window对象,这样一来访问的速度就更快了。

    作用域

    局部变量

    1. 在函数内部声明的变量
    2. 使用let声明的变量

    全局变量

    1. 变量在函数外定义
    2. 变量在函数内没有声明(没有使用 var 关键字)

    注:在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。
    在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量全部覆盖。

    作用域链

    当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。

    1.当执行函数时,总是先从函数内部找寻局部变量

    2.如果内部找不到(函数的局部作用域没有),则会向创建函数的作用域(父级函数作用域)寻找,依次向上,直到找到为止

    var global_variable1=10;
    function test1(){
    	var local_variable1={name:'html'};
    	var global_variable1=1;
    	global_variable2=11;
    	local_variable2=[1,2];
    	var local_variable2;
    	function test2(){
    		console.log(global_variable1);//如果在第4行声明了和全局变量global_variable1同名的局部变量,则输出1,如果没有,则输出10
    	}
    	console.log(global_variable1);//如果在第4行声明了和全局变量global_variable1同名的局部变量,则输出1,如果没有,则输出10
    	console.log(local_variable1);//{name: "html"}
    	console.log(global_variable2);//11
    	console.log(local_variable2);//[1,2]js函数中声明的变量(但是不涉及赋值)都被“提前”至函数体的顶部,变量初始化留在原来的位置。
    	test2();
    }
    //console.log(local_variable);//Uncaught ReferenceError: local_variable is not defined
    test1();
    //test2();//Uncaught ReferenceError: test2 is not defined
    console.log(global_variable2)//11
    

    注:在上述代码中,当执行test2时,创建函数test2的执行环境,并将该对象置于链表开头,然后将函数test1的调用对象放在第二位,最后是全局对象,作用域链的链表的结构是test2——>test1——>window。从链表的开头寻找变量global_variable1,即test2函数内部找变量global_variable1,发现没有,继续向上找,这时分为两种可能:

    1. 当test1中没有对global_variable1重新声明时,则在test1中也没有找到,继续向上,找到window中的global_variable1变量,结果是10,

    2. 当test1中对global_variable1重新声明时,则在test1中找到global_variable1变量,结果是1。

    闭包

    闭包是指可以访问另一个函数作用域中变量的函数,由于在JavaScript中,只有在函数内部的子函数才可以访问局部变量,所以创建闭包的最常见的方式就是在一个函数内创建一个子函数函数,通过这个子函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

    闭包的特点:

    1.函数内嵌套函数一个或多个子函数
    2.内部函数可以引用外层的参数和变量
    3.参数和变量不会被垃圾回收机制回收
    JavaScript垃圾回收机制请看郑文亮先生的博客:https://www.cnblogs.com/zhwl/p/4664604.html

    内存泄漏的情况举例

    内存泄漏(memory leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

    内存溢出(out of memory)是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory,比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
    注:内存泄漏最终会导致内存溢出

    1. 意外的全局变量引起的内存泄漏(比如在函数内没有使用var关键字声明的变量或者使用this声明的变量)。

      原因:全局变量,不会被回收。

      解决:使用严格模式(‘use strict’)避免。

    'use strict'
    function test1(){
    	global_variable1='我是全局变量';//这个变量的作用域是window
    	console.log(1)
    }
    test1()//使用严格模式报错:Uncaught ReferenceError: global_variable1 is not defined
    function test2(){
    	this.global_variable2='我是this创建的变量';
    	console.log(2)
    }
    test2()//使用严格模式报错:Uncaught TypeError: Cannot set property 'global_variable2' of undefined
    
    1. 闭包引起的内存泄漏

      原因:闭包可以让函数内的局部变量不被垃圾回收机制回收。

      解决:将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对dom的引用。

    var testObj1={};
    setInterval(function (){
    	var testObj2=testObj1;
    	var fn=function (){//未使用,但是引用了testObj1,所以为被回收,如果testObj1中的变量是大数据时的,则cpu内存会快速增加,可以使用谷歌的performance检测(不到10秒中,就奔溃了)
    		if(typeof testObj2 =='object'){
    			console.log('testObj2是对象')
    		}
    	};
    	testObj1={
    		name:new Array(100000000).join(','),
    		operation:function(){
    			console.log('我在飘啊飘')
    		}
    	};
    },1000);
    

    performance检测结果
    3. 定时器未清除

    原因:定时器中有dom的引用,即使dom删除了,但是定时器还在,所以内存中还是有这个dom。

    解决:清除定时器

    <ul id='ul'>
    	<li>
    		<a href="">a标签1</a>
    	</li>
    	<li>
    		<a href="">a标签2</a>
    	</li>
    	<li>
    		<a href="">a标签3</a>
    	</li>
    </ul>
    
    var timer =setInterval(function(){
    	$('#ul').empty();//删除ul中的子元素
    	window.location.reload();//刷新当前页面
    	console.log($('li'));//当没有清除定时器时会打印出li的元素集(因为是在定时器中打印,所以每个3秒闪烁一次),当有使用clearInterval清除定时器时在不会打印出内容。
    },3000);
    clearInterval(timer);
    
    展开全文
  • 匿名函数与自执行函数

    千次阅读 2020-03-13 11:54:16
    匿名函数与自执行函数 匿名函数就是指的没有名字的函数,即定义函数对象时不定义函数体名字,但是必须将匿名函数作为表达式赋予一定操作,比如将其作为变量值或者让其自执行,否则这次定义将无意义,解释器也会抛出...
  • JavaScript之自执行函数

    2019-05-24 09:19:06
    JavaScript之自执行函数什么是自执行函数实例 什么是自执行函数 一种理解是,自执行即自动执行,也就是所谓的立即执行函数。 还有一种理解,即自执行函数是在函数内部执行函数本身,即我们平时常说的递归函数。 ...
  • jQuery 自执行函数

    2019-02-22 15:17:00
    jQuery 自执行函数 // 为了避免三方名冲突可将全局变量封装在自执行函数内 (function (arg) { var status = 1; arg.extend({ 'xsk': function () { return 'xsk'; } }); })(jQuery); 转载于...
  • var foo='hello'; (function(foo){ console.log(foo);...在js代码自上而下执行的时候,自执行函数不在进行变量提升,那么他本身在执行的时候里面也不进行变量提升吗? foo || “world”这句话改怎么理解?
  • 1、自执行函数和闭包 在js中也有这个概念,这样可以加深我们对函数的里面+ 自执行函数 1、1 通过学习javascript我们再来深入学习go的语法,在javascript的意思就是自己调用自己 (function ( a, b) { console.log...
  • 什么是自执行函数

    2019-09-10 09:25:13
    【 什么是自执行函数?】 大家好,我是IT修真院北京总院第24期的学员,一枚正直纯洁善良的web程序员 今天给大家分享一下,修真院官网js任务2,深度思考中的知识点——什么是自执行函数? 1.背景介绍 在详细讲解...
  • javascript自执行函数

    千次阅读 2015-12-13 10:49:53
    javascript自执行函数又被称为立即调用函数,下面是其用法、作用和理解
  • es6 箭头函数->自执行函数

    千次阅读 2019-05-31 02:00:44
    使用自执行函数能够确保该函数能够自行执行,而不需要额外编写代码执行它 const test = (id => { return { getId() { console.log(id); } }; })(18); test.getId(); // 18 复制代码console.log( (id =>...
  • 2. 自执行函数 3. 闭包 1. 匿名函数俗称没有名字的函数,一般用来返回其内部的函数或者变量。 2. 自执行函数,等于普通函数+调用。 3. 闭包:在一个函数外部调用这个函数内部作用域包含的变量或者函数。 ...
  • js匿名自执行函数

    2018-03-19 10:07:58
    匿名自执行函数:没有方法名的函数闭包:闭包是指有权访问另一个函数作用域变量的函数;通过一个实例来解释:从网上找到了一个案例,使用了for循环、匿名自执行函数、setTimeout。案例1:var value1 =0,value2=0,...
  • 函数声明:function box(){} 函数表达式:var box = function(){}; 匿名函数:function(){} (属于函数表达式) 1声明了一个函数: var box= ...自执行函数: 1能够将匿名函数与调用的()为一个整体,官方推荐使用;...
  • 自执行函数的理解

    千次阅读 2016-12-14 10:25:59
    今天抽空研究一下jquery的源码,发现jquery的整体框架是从自执行函数开始的。(function(e, t) {})(window),今天就来好好研究下这个自执行函数是怎么回事。 首先区分两个概念,函数声明,函数表达式。 function fn(){...
  • js中的匿名函数和匿名自执行函数

    万次阅读 2017-05-27 21:56:54
    js中匿名函数和匿名自执行函数以及常见的使用场景
  • 闭包之自执行函数

    2017-05-11 10:11:35
    不知道你对上篇文章的闭包理解多少,其实也不必强求自己一下就是理解了,因为这是中间会有一个...比如说别人问你为什么要是使用自执行函数,你会不假思索的说可以防止变量污染,按照套路来的话,别人会接着问你为什么,
  • var foo='hello'; (function(foo){ console.log(foo); var foo=foo||'world';... JS代码自上而下执行的时候,自执行函数不在进行变量提升,但是函数内部的变量提升还进行吗?food ||“world”改怎样理解?
  • 1.关于自执行函数 1.1 写自执行函数的好处:独立的作用域,不会污染全局环境123(function() { })(); 1.2 理解重点:函数的自执行过程 1.3 参考书籍:JS高级程序设计指南 1.4 给自执行函数加参数的好处:对于...
  • javascript中函数声明、函数表达式以及匿名函数和自执行函数 1.函数声明和函数表达式  1)函数声明必须始终带有一个标识符(Identifier),也就是我们所说的函数名,而函数表达式则可以省略  //函数声明 ...
  • JavaScript/JQuery自执行函数

    千次阅读 2016-04-12 15:06:08
    自执行函数JavaScript中任何库与框架设计的第一个要点就是解决命名空间与变量污染的问题。jQuery就是利用了JavaScript函数作用域的特性,采用自执行函数包裹了自身的方法来解决这个问题。从jQuery不同的版本中可以...
  • for循环与自执行函数

    千次阅读 2017-10-24 15:56:37
    for循环与自执行函数 一般情况下,for循环输出的值都是判断条件的最后一个值,但是当for循环里面的代码是一个自执行函数时有会出现怎样的情况呢,下面我尝试了几种情况: for(var i = 0 ; i ; i++){ (function(n){ ...
  • (function(){ console.log(this.foo);//this指向的是window })(); 自执行函数的this都指向window
  • JavaScript匿名自执行函数的用处

    千次阅读 2017-03-04 16:55:03
    什么是匿名自执行函数?;(function () { /* 代码片段 */ )() 形如上面的函数就是匿名自执行函数,没有函数名所以是匿名函数,函数外围的第一对括号返回一个匿名函数,第二对括号立即执行该匿名函数。 前面的分号...
  • 自执行函数写法 这种写法是错误的: function(){  alert(1);  }();   原因: 原因是前半段“function(){alert(1);}”被当成了函数声明,而不是一个函数表达式,从而让后面的“();”变得孤立,产生语法错...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,389
精华内容 15,755
关键字:

自执行函数