irpas技术客

JavaScript高级 函数进阶_xihuanLilia

大大的周 4815

函数进阶 函数的定义方式‘函数的调用方式函数中的this指向问题改变this的指向call方法apply()bind()bind()方法的应用 三种方法的区别

函数的定义方式‘

我们常用的函数定义有两种 一种是自定义函数 也叫命名函数 如下

function fn(){}

一种是函数表达式 也叫匿名函数 如下

var fun = function (){}

但是我们也有第三种方式 利用new关键字创造函数

var fun = new Function()

我们都知道 函数有参数 和形式体 那么我们用new创造 的函数一定也有参数和函数体 利用new function (参数1 参数2 函数体) 要记住 的是 参数和函数体都需要以字符串的方式 即必须加引号 案例如下 虽然这种方法很麻烦 性能也差 但是由此我们可以得知 所有函数都是Function(第三种方法展示的函数)的实例( 对象 ) 简单总结为 函数也是一个对象

函数的调用方式 // 1 普通函数调用 function fn(){ console.log('好困'); } fn(); fn.call() // 2 对象中的函数 var obj = { say : function(){ console.log('好困'); } } // 3 构造函数 function Say(){ } new Say(); // 4 绑定事件 btn.onclick = function(){} // 5 定时器函数 setInterval(function() { }, 1000); ### 6 立即执行函数 (function () { })() 函数中的this指向问题

对应上面的调用函数的方式 如下图所示

改变this的指向 call方法

call()方法可以调用函数 可以简单的理解为调用函数的方式 也可以改变函数的this的指向 语法如下 需要改变指向的函数.call(改变的this指向,参数1 , 参数2)

我们知道 普通函数的this指向window 我们创建一个普通函数 打印它的this 并调用 接着我们使用call方法改变 this指向 并加入参数

fn.call(x,2,3)

call() 还有一个注意作用是用来继承 如下

function Father(uname, age) { this.uname = uname; this.age = age; } function Son(uname, age, sex) { Father.call(this, uname, age); this.sex = sex; } apply()

apply()方法和call()方法类似 可以调用函数 和改变this的指向 语法如下 需要改变指向的函数.apply(thisArg,[argsArray]) thisArg 在fun函数运行时指定的this值 argsArray 传递的值 必须包含在数组里面 返回值就是函数的返回值 因为它调用了函数 案例如下

apply()方法主要应用于将数组利用于其他数据的类型的方法

比如说我们有一个数字型的方法 Math.max 我们想数组求最大值

我们就可以利用apply()来解决这个问题

bind()

bind()方法不会调用函数 但是也可以改变内部的this指向 语法: 需要改变this指向的函数.bind(改变的this值,参数1,参数2) 返回由指定的this值和初始化函数改造的 原函数拷贝 案例如下

bind()方法的应用

bind()方法看似麻烦 其实是我们实际开发中最方便常用的 案例如下 我们有一个按钮 当我们点击后禁用三秒

<button>点击</button> <script> var btn = document.querySelector('button'); btn.onclick = function(){ this.disabled = true; setTimeout(function(){ this.disabled = false; }.bind(this),3000) } </script> 三种方法的区别

相同点 : 都可以改变函数内部的this指向

区别点 call 和apply 都会调用函数 并且改变函数内部this的指向 call和appky会传递的参数不一样 call传递的是参数 但是apply传递参数必须以数组的形式 bind不会调用函数

call主要用来做继承 apply经常和数组有关系 bind不调用函数 但是还想改变this指向 比如改变定时器中的this指向


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #JavaScript高级 #函数进阶 #也叫命名函数 #如下function #fn一种是函数表达式 #也叫匿名函数 #如下var