1. 函数的定义和调用

1.1 函数的定义方式

  1. 函数声明方式function关键字(命名函数)
  2. 函数表达式(匿名函数)
  3. new Function()
var fn = new Function('参数1', '参数2',...,'函数体')
  • Function里面参数都必须是字符串格式
  • 第三种方式执行效率低,也不方便书写,用的比较少
  • 所有函数都是Function的实例(对象)
//函数声明方式
function fn() {} //函数表达式(匿名函数)
var fn = function() {} //利用new Function('arg1','arg2', 'fn')
var f = new Function('a','b',console.log(a+b)')
f(1,2) // 3

所有的函数都是Function实例对象

1.2 函数的调用方式

  1. 普通函数
  2. 对象的方法
  3. 构造函数
  4. 绑定事件函数
  5. 定时器函数
  6. 立即执行函数
// 普通函数
function fn() {
console.log('前端岚枫博客')
}
fn() //前端岚枫博客 //对象的方法
var obj = {
say: function () {
console.log('前端岚枫博客')
}
}
obj.say() //前端岚枫博客 //构造函数
function Star() {
}
new Star() //绑定的事件函数
btn.onclick = function() {} //点击了按钮就可以调用该函数 //定时器函数
setInterval(function() {}, 1000) //立即执行函数
(function() {
console.log('前端岚枫博客') //自动调用
})()

2. this

2.1 函数内this的指向

这些this的指向,是当调用函数的时候确定的调用方法的不同决定了this的指向不同,一般指向调用者。
调用方式

调用方式 this指向
普通函数调用 window
构造函数调用 实例对象 原型对象里面的方法也指向实例对象
对象方法调用 该方法所属对象
事件绑定方法 绑定事件对象
定时器函数 window
立即执行函数 window

2.2 改变函数内部this指向

Javascript为提供了一些函数方法来帮助我们更优雅地处理函数内部this的指向问题,常用的有bind()、call()、apply()三种方法。接下来,我们来详细的介绍一下这三种方法的用法,看看它们是如何改变this指向的。

  1. call方法

call()方法调用一个对象,简单理解为调用函数的方式,但是它可以改变函数的this指向。

fn.call(thisArg, arg1, arg2, ...)
var obj = {
name: 'lanfeng'
}
function fn(a, b) {
console.log(this)
console.log(a+b)
}
fn(1,2)//指向window, 3
fn.call(obj, 1, 2) //指向obj, 3 //实现继承
function Father(uname, age, sex) {
this.uname = uname
this.age = age
this.sex = sex
}
function Son () {
Father.call(this,uname, age, sex)
}
var son = new Son('柳岩',18,'女')

call:第一个可以调用函数,第二个可以改变函数内的this指向
call的主要作用可以实现继承

  1. apply方法

apply()方法调用一个函数。简单理解为调用函数的方式,它与call方法一样可以改变函数的this的指向,但是它跟call传参数方式不一样,它是传的参数必须在一个数组里

fun.apply(thisArg, [argsArray])
  • thisArg:在fun函数运行时指定this的值
  • argsArray: 传递的值,必须包含在数组里面
  • 返回值就是函数的返回值,因为它就是调用函数
var obj = {
name: 'lanfeng'
}
function fn(a, b) {
console.log(this)
console.log(a+b)
}
fn(1,2)//指向window, 3
fn.apply(obj, [1, 2]) //指向obj, 3

apply:第一个可以调用函数,第二个可以改变函数内的this指向
apply的参数必须时数组(伪数组)
apply的主要应用,求数数组中的最大值,最小值

var arr = [1, 66, 3, 99, 4]
var max = Math.max.apply(Math, arr)
var min = Math.min.apply(Math, arr)
console.log(max, min) //99 1
  1. bind方法

bind()方法不会调用函数,但是能改变函数内部this指向

fn.bind(thisArg, arg1, arg2, ...)
  • thisArg: 在fn函数运行时指定的this值
  • arg1, arg2: 传递的其他参数
  • 返回由指定的this值和初始化参数改造的原函数拷贝
var obj = {
name: 'lanfeng'
}
function fn(a, b) {
console.log(this)
console.log(a+b)
}
fn(1,2)//指向window, 3
var f = fn.bind(obj, 1, 2)
f()

bind: 不会调原来的函数,可以改变this指向,返回的函数是改变this之后产生的新函数
bind的应用: 如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind

var btn = document.querySelector('button')
//以前的用法
btn.onclick = function() {
var that = this
this.disabled = true
setTimeout(function(){
that.disabled = false
}, 3000)
} // bind用法
btn.onclick = function() {
this.disabled = true
setTimeout(function(){
this.disabled = false
}.bind(this), 3000)
}

2.3 call apply bind 总结

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

  1. call 和apply 会调用函数,并且改变函数内部的this指向
  2. call和apply传递的参数不一样,call传递参数形式arg1, arg2, ...形式,apply必须数组形式
  3. bind不会调用函数,可以改变函数内部的this指向

主要应用场景:

  1. call经常做继承
  2. apply经常跟数组有关系,比如借助于数学对象实现数组的最大值最小值
  3. bind不调用函数,但是还想改变this指向,比如改变定时器的内部this指向

总结

本篇文章主要分享了javascript的函数定义、用法、this及改变this指向的几种方法、如想了解更多,请扫描二维码:

带你学习Javascript中的函数进阶(一)的更多相关文章

  1. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  2. JavaScript中Eval()函数的作用

    这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...

  3. 谈谈javascript 中的函数问题

    聊聊javascript中的函数 本文可作为李刚<疯狂htmlcssjavas讲义>的学习笔记 先说一个题外话 前几天在知乎上流传着一个对联  上联是雷锋推到雷峰塔 nnd 这是什么对联? ...

  4. JavaScript中的函数-7---函数的作用,定义,调用

    JavaScript中的函数 函数也是对象,并且是javascript中的一等公民,可以用来创建普通对象.对象只是属性和值的集合 学习目标 1.掌握函数的作用 2.掌握函数的定义 3.掌握函数的调用 ...

  5. 如何理解并学习javascript中的面向对象(OOP) [转]

    如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript ...

  6. 一篇文章带你了解JavaScript中的变量,作用域和内存问题

    1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为应用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaS ...

  7. 一起学习PHP中断言函数的使用

    原来一直以为断言相关的函数是 PHPUnit 这些单元测试组件提供的,在阅读手册后才发现,这个 assert() 断言函数是 PHP 本身就自带的一个函数.也就是说,我们在代码中进行简单的测试的时候是 ...

  8. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  9. JavaScript中的函数表达式

    在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...

随机推荐

  1. c# winform清空ie缓存的几种方法

    很明显 IE的缓存在其目录中显示的并不是真正的文件所处的位置,文件的位置是在隐藏的文件夹中,而且这个隐藏的文件夹我们一般找不到.在网上几种清空缓存的方法,在此我一一把代码和处理的效果显示出来.供大家参 ...

  2. 爬虫—文件存储—CSV存储

    一,简介 CSV,全称Comma—Separated Values,可以称为逗号分隔或者字符分隔值,其文件以纯文本形式存储表格数据.该文件是一个字符序列,可以有任意的数目记录组成,记录间已某种换行符分 ...

  3. Opencv笔记(十)——卷积基础

    卷积 什么是二维卷积呢?看下面一张图就一目了然:         卷积就是循环对图像跟一个核逐个元素相乘再求和得到另外一副图像的操作,比如结果图中第一个元素5是怎么算的呢?原图中3×3的区域与3×3的 ...

  4. Angular(一)

    Angular开发者指南(一)入门介绍   什么是AngularAngularJS是动态Web应用程序的结构框架. 它允许您使用HTML作为模板语言,并允许您扩展HTML的语法以清晰,简洁地表达应用程 ...

  5. 电脑C盘空间不足

    电脑C盘空间不足,又不知道哪些文件可以删,可以下载下面的批处理文件 @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.t ...

  6. aclocal-1.13: command not found

    原因: 将编译好的工程拷贝到系统版本不一样的系统中,再进行编译会出现此类问题. 解决方法: yum install automake autoconf yum install libtool auto ...

  7. android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

    Android精选源码 app 版本更新.下载完毕自动自动安装 android指针式分数仪表盘 ANdroid蓝牙设备搜索.配对 Android 图片水印框架,支持隐形数字水印 android3D旋转 ...

  8. 一:MYsql登录,服务开启和停止

    字段的属性: 1:名称 2:数据类型 3:长度 4:约束 SQL的分类:(结构化查询语言) 1:数据查询语言DQL    select 2:数据操纵语言DML    insert  delete  u ...

  9. getline的使用

    函数定义: getline(istream &in, string &s) 作用: 在C++中用 string 类型进行终端输入字符串时,解决无法输入带有空格的字符串的问题. 功能: ...

  10. JAVA线程笔记。

    继承thread类 并覆写thread类中的run()方法. class 类名称 extents Thread{public void run(){}}实现Runble接口的run方法 线程的star ...