JavaScript的函数IIFE

javaScritp的函数(IIFE)

一、认识函数

  javaScritp中的的函数

// 函数声明语法定义
function fun1(name, age) {
    console.log(name + ‘,‘ + age);
}
fun1(‘Amy‘, 18); //Amy,18
// 函数表达式定义
var fun2 = function(name, age) {
    console.log(name + ‘,‘ + age);
}
fun1(‘Amy‘, 18); //Amy,18

  

  javaScript函数带默认参数

/* 默认参数 */
function fun1(name, age = 17) {
    console.log(name + ‘,‘ + age);
}

fun1(‘Amy‘, 18); //Amy,18
fun1(‘Amy‘, ‘‘); // Amy,
fun1(‘Amy‘); // Amy,17
fun1("Amy", null); // Amy,null

  

  函数参数默认值存在暂时性死区,在函数参数默认值表达式中,还未初始化赋值的参数值无法作为其他参数的默认值。

function fun2(x, y = x) {
    console.log(x, y);
}
fun2(1); // 1 1

function fun3(x = y) {
    console.log(x);
}
fun3();  // ReferenceError: y is not defined

  

  javaScript函数 不定参数

// 不定参数用来表示不确定参数个数
function fun4(...values) {
    console.log(values.length);
}
fun4(1, 2); //2
fun4(1, 2, 3, 4); //4

  

  Function的构造定义

通过Function构造函数创建函数,可向构造函数中传入任意数量的参数,但值得注意的是传入的最后一个参数会作为函数体,而其他参数则作为参数传入函数中。用该方法去定义函数是不推荐使用的,因为该语法会导致解析两次代码,第一次解析常规ECMAScript代码,第二次解析传入构造函数的字符串,影响性能。

var functionName = new Function("value",...,"函数体");
var f2=new Function("n1","n2","return n1+n2;");
console.log(f2(1,2)); // 3

注:函数是引入值类型,所以函数名仅仅是指向函数的指针,当使用函数名去赋值给另一个变量名时,仅仅复制的是一个指针。即在下列a设置为null时,仅将a存的指针消除而已,不会影响b调用函数。

var a = b = function(value1){
    return value1;
}
a = null;
b(1);

function中的默认对象叫arguments,类似数组,但不是数组,该对象是传递给函数的参数。我们可以通过这个arguments知道该函数有多少个参数

function counter(){
    var sum=0;
    for(var i=0;i<arguments.length;i++){
            sum+=arguments[i];
    }
     return sum;
}
console.log(counter(199,991,1,2,3,4,5)); // 1205
console.log(counter()); // 0

注:这里的arguments是一个隐式对象,不声明也在函数中,内部函数可以访问外部函数的任意内容,但是不能直接访问外部函数的arguments与this对象。

function f1() {
    console.log(arguments.length);
    f2=function() {
        console.log(arguments.length);
    }
     return f2;
}

var f=f1(1,2,3); // 3
f(); // 0

  

  function.call -调用一个对象的一个方法,以另一个对象替换当前对象

/*构造函数*/
function Student(name,age){
       this.name=name;
       this.age=age;
}

show=function(add){
       console.log(add+":"+this.name+","+this.age);
}

//通过new关键字调用构造函数,创建一个对象tom
var rose=new Student("rose",18);
var jack=new Student("jack",20);

//调用show方法,指定上下文,指定调用对象,this指向rose,“大家好是参数”
show.call(rose,"大家好"); // 大家好:rose,18
show.call(jack,"Hello"); // Hello:jack,20

call方法中的参数都可以省去,第1个参数表示在哪个对象上调用该方法,或this指向谁,如果不指定则会指向window对象。

var name="无名";
var age=18; // 全局变量
show.call(); // undefined:无名,18

 立即执行表达式函数(IIFE)

块级作用域与函数作用域

 function calc(){
      for(var i=0;i<5;i++){
            console.log(i); //  //0,1,2,3,4
      }
      console.log(i); // 5
}
calc();

函数没有块级作用域所以后面输出的i是5,没有报错

解决方法,模拟一个块级作用域

 function calc() {
       //IIFE
       (function() {
               for(var i = 0; i < 5; i++) {
                     console.log(i); //0,1,2,3,4
               }
        })();
      console.log(i); //报错
}

calc();

  函数表达式或匿名对象立即执行

//调用匿名函数
(function() {
     console.log("这是一个函数表达式");
 })();

 //调用匿名对象
 ({
    name: "foo",
    show: function() {
      console.log(this.name);
   }
  }).show();
console.log({a: 1}.a);
console.log({a: function() {}}.a());

多种函数立即表达式的写法

//最常用的两种写法
(function(){ /* code */ }()); // 推荐写法
(function(){ /* code */ })(); // 当然这种也可以

// 括号和JS的一些操作符(如 = && || ,等)可以在函数表达式和函数声明上消除歧义
// 如下代码中,解析器已经知道一个是表达式了,于是也会把另一个默认为表达式
// 但是两者交换则会报错
var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();

// 如果你不怕代码晦涩难读,也可以选择一元运算符
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// 你也可以这样
new function(){ /* code */ }
new function(){ /* code */ }() // 带参

立即表达函数带参数

(function (n){
      console.log(n); // 100
})(100);

最好在立即表达函数前面添加分号

 var k=100
(function (n){
      console.log(n);
})(k);
// 出错,解释器会认为100是函数
var k=100
;(function (n){
         console.log(n);
})(k);

  

  IIFE的形变

(function(n){
     console.log(n);

     //认为这里有30000代码

}(100));

如果中间有很长的代码,参数100只有到文档的末尾才可以看得到,变形后的结果:

(function(exp){
       exp(100);
}(function(n){
       console.log(n);
       //认为这里有30000代码
}));

原文地址:https://www.cnblogs.com/yangWanSheng/p/11708562.html

时间: 2024-10-08 21:47:03

JavaScript的函数IIFE的相关文章

立即执行函数(IIFE)的理解与运用

作为JavaScript的常用语法,立即执行函数IIFE(Immediately-Invoked Function Expression)是值得我们认真去学习探究的. 一.创建函数的两种方式 我们先从基础讲起,要创建一个JS函数,有两种方式. (一)函数定义(Function Declaration) function Identifier ( Parameters ){ FunctionBody } 函数定义中,参数(Parameters)标识符(Identifier )是必不可少的.如果遗漏

JavaScript Function 函数深入总结

整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下文,私有变量等知识点的深入理解. 函数中的return return 语句可以不带有任何返回值,在这种情况下( return; 或函数中不含 return 语句时),函数在停止执行后将返回 undefiend 值.这种用法一般在需要提前停止函数执行而又不需要返回值的情况下. return false

javascript中函数作用域之”提升“

javascript中函数作用域之变量提升 当我们在函数内部用关键字var声明一个变量的时候,此变量的作用域限制在当前函数. 提升:在一个作用域内部,不管一个变量用var声明的位置在哪里,这个变量属于当前整个作用域,并且在当前作用域的任何位置都可以访问它.在javascript中,这种行为/现象称之为"提升",即一个变量在一个作用域的任何位置用var声明,javascript引擎都会把这些用var声明的变量"移动"到当前作用域的开始处. 谈到javascript这种

JavaScript 常用函数总结

javascript函数:  ·常规函数  ·数组函数  ·日期函数  ·数学函数  ·字符串函数 .cookie函数 1.常规函数 javascript常规函数包括以下9个函数:  (1)alert函数:显示一个警告对话框,包括一个OK按钮.  (2)confirm函数:显示一个确认对话框,包括OK.Cancel按钮.  (3)escape函数:将字符转换成Unicode码.  (4)eval函数:计算表达式的结果.  (5)isNaN函数:测试是(true)否(false)不是一个数字. 

JavaScript调用函数的方法

摘要:这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下,许多那样的代码是我写的).JavaScript拥有函数式编程的特性,当我们选择面对它的时候,这将成为我们前进的阻碍.  作为初学者,我们来测试五种函数调用的方法,从表面来看我们会认为那些函数与C#中函数的作用非常相似,但是我们一会儿可以看到

javascript篇-----函数作用域,函数作用域链和声明提前

在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于这类型的编程语言,javascript是没有块级作用域.取而代之的,javascript使用的是块级作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. 在如下的所示的代码中,在不同位置定义了变量 i . j 和 k ,它们都在同一个作用域内——这三个变量在函数体内均是有定义

和demopu一起学习javascript ( concat函数 )

和demopu一起学习javascript (  concat函数 ) 定义和用法 concat方法可以把两个或者多个数组连接起来,组成一个新的数组. 语法 concat(array1,array2,......,arrayN) 参数 描述 array1 必需.该参数可以是具体的值,也可以是数组对象.可以是任意多个. 例子 1 var arr = ["George","John","Thomas"]; var arr2 = ["Jame

JavaScript encodeURI() 函数

encodeURI() 函数可把字符串作为 URI 进行编码. -------------------------------------------------------------------------------------------- 输入: <script type="text/javascript">document.write(encodeURI("http://www.w3school.com.cn")+ "<br

javascript常用函数整理

javascript函数: 1.禁止鼠标右键菜单代码块 function stop() {     return false; } document.oncontextmenu = stop; //禁用鼠标右键 document.ondragstart = stop; //禁止拖动 document.onselectstart = stop; //禁止选择 2.判断打开的页面是否存在父页面 if (window.top == window.self && window.parent ==