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 相关文章推荐
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
JavaScript匿名函数与委托使用示例
Jul 22 Javascript
AngularJS 模型详细介绍及实例代码
Jul 27 Javascript
javascript iframe跨域详解
Oct 26 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
Apr 27 jQuery
浅谈redux以及react-redux简单实现
Aug 28 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
Nov 14 Javascript
JavaScript ES6中的简写语法总结与使用技巧
Dec 30 Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 Javascript
vue中使用[provide/inject]实现页面reload的方法
Sep 30 Javascript
JavaScript正则表达式验证登录实例
Mar 18 Javascript
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
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
PHP微信支付开发实例
2016/06/22 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
vue实现简单图片上传
2020/06/30 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
详解python中的 is 操作符
2017/12/26 Python
python3调用windows dos命令的例子
2019/08/14 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
Python 从attribute到property详解
2020/03/05 Python
numpy实现RNN原理实现
2021/03/02 Python
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
金士达面试非笔试
2012/03/14 面试题
2015年企业新年寄语
2014/12/08 职场文书
自主招生专家推荐信
2015/03/26 职场文书
纪检监察立案决定书
2015/06/24 职场文书
小学教师教学随笔
2015/08/14 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js