JavaScript函数IIFE使用详解


Posted in Javascript onOctober 21, 2019

一、认识函数

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代码
}));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
过虑特殊字符输入的js代码
Aug 05 Javascript
javascript中apply、call和bind的使用区别
Apr 05 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
卸载安装Node.js与npm过程详解
Aug 15 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
js实现华丽的九九乘法表效果
Mar 29 Javascript
bootstrap switch开关组件使用方法详解
Aug 22 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 Javascript
微信小程序实现tab页面切换功能
Jul 13 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
Mar 04 Javascript
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue实现侧边栏导航效果
Oct 21 #Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 #Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 #Javascript
关于Vue中axios的封装实例详解
Oct 20 #Javascript
JavaScript相等运算符的九条规则示例详解
Oct 20 #Javascript
Vue.js下拉菜单组件使用方法详解
Oct 19 #Javascript
vue实现二级导航栏效果
Oct 19 #Javascript
You might like
第二节 对象模型 [2]
2006/10/09 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
javascript中的一些注意事项 更新中
2010/12/06 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python导入txt数据到mysql的方法
2015/04/08 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
机械专业毕业生自荐信
2013/11/02 职场文书
《雾凇》教学反思
2014/02/17 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
生日宴会策划方案
2014/06/03 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
Oracle表空间与权限的深入讲解
2021/11/17 Oracle
MySQL数据库 安全管理
2022/05/06 MySQL