一、作为独立函数调用

function printThis() {return this;
}
console.log(printThis() === window) // 严格模式下打印 false,非严格模式下打印 true

在严格模式下 printThis 调用时 this 指向 undefined。 非严格模式下 printThis 调用是 this 指向 window

二、作为对象中的方法调用

function printThis() {return this;
}
const obj = {printThis}
console.log(obj.printThis() === window) // 输出 false

当函数被作为对象的方法调用时 obj.printThis(),此时 this 的指向为 obj

三、作为构造函数调用

  • new 关键字实例化
function Dog() {this.name = 'Puppy'
}/**
* 正确
* 通过 new 关键字实例化构造函数
*/
const dog = new Dog()
console.log(dog.name) // 输出 Puppy/**
* 错误
*/
const dog = Dog()
console.log(dog.name) // 报错,name 找不到

作为构造函数调用时必须使用 new 关键字,返回的实例,也就是 dog,此时 dog 指向 Dog。

  • 改变构造函数实例
const puppet = {rules: false
};
function Emperor() {this.rules = true;return puppet;
}
const emperor = new Emperor();
console.log(emperor.rules); // 输出 false

虽然 Emperor 函数被当作构造函数调用时,this 指向使用构造函数的实例,也就是 emperor, 但是 Emperor 构造函数在实例化中返回 puppet,有返回值并且返回值是对象,此时的实例其实是 puppet,所以 emperor.rules 输出 false。

四、作为 apply、call、bind 方法调用

  • Function.prototype.apply 方法和 Function.prototype.call 方法有什么异同?

-- 第一个参数为冒充对象的 this,不传 this 在非严格模式下指向 window,在严格模式下指向 undefined。

// 非严格模式
var sData = 'Wisen'
function display() {console.log('sData value is %s ', this.sData);
}
display.call();  // sData value is Wisen
'use strict';
var sData = 'Wisen';
function display() {console.log('sData value is %s ', this.sData);
}
display.call(); // 报错,'sData' of undefined

-- 参数格式不同,apply 接收数组字面量,实事上可以接收任何类数组的参数,NodeListarguments,只要是有 length 属性并且是 (0..length-1) 范围的整数就可以。

fun.apply(this, ['a', 'b']);
fun.apply(this, new Array(['a', 'b']));
fun.apply(this, { length: 2, '0': 'a', '1': 'b' });

  • 在浏览器中运行以下脚本,点击页面后,会打印出 false。请问为什么会打印出 false?
function Button() {this.clicked = false;this.click = function () {this.clicked = true;console.log(button.clicked, 'clicked');};
}
const button = new Button();
document.addEventListener("click", button.click)

当点击的时候,this.clicked 指向的是点击的 DOM 元素,点击的 DOM 元素 clicked 属性置为 true,所以 button.clicked 依然打印 false。

  • 修改代码打印 true

-- 箭头函数方式,箭头函数没有自己的 this 值,箭头函数中的 this 值是由初始定义的代码块上下文中的 this 决定的,也就是箭头函数被定义时 this 指向本次的构造函数。

function Button() {this.clicked = false;this.click = () => {this.clicked = true;console.log(button.clicked, 'clicked');};
}
const button = new Button();
document.addEventListener("click", button.click)

-- bind 方式,调用时创建并返回改变 this 指向的函数,并在稍后手动执行,applycall 在调用时会立即执行。

function Button() {this.clicked = false;this.click = function () {this.clicked = true;console.log(button.clicked, 'clicked');};
}
const button = new Button();
document.addEventListener("click", button.click.bind(button))

button执行onclick函数_JavaScript 函数定义与调用相关推荐

  1. python语言中函数在调用前必须先定义吗_Python函数必须先定义,后调用说明(函数调用函数例外)...

    java开发者在定义类中的方法时,不会关心方法的定义相对于调用语句的位置. 但是python中需要注意: 函数必须先定义.后调用(函数调用函数例外). 如下为示例说明: 1.python函数的应用一般 ...

  2. 慕课matlab学习 第三章-017 函数文件的定义和调用

    第三节 程序流程控制 06-用函数文件的定义与调用 % 第三节 程序流程控制 % 06-用函数文件的定义与调用% 函数文件的基本结构 % function输出形参表=函数名(输入形参表) % 注释说明 ...

  3. 3.6 matlab函数文件的定义与调用

    1.函数文件的基本结构 function 输出形参表=函数名(输入形参表) 注释说明部分 函数体语句 当有多个形参时,形参之间用逗号分隔,组成形参表.当输出形参多于一个时,应该用方括号括起来,构成一个 ...

  4. scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数

    scala 函数中嵌套函数 A function is a set of statements combined together to perform a specific task. The co ...

  5. 函数嵌套的定义与调用:

    函数嵌套 (1)函数嵌套调用:在函数内部又调用其他函数. def index(): print('index') ​ def func(): index() # 在定义 func 函数的时候不会直接调 ...

  6. C语言函数声明、定义、调用

    函数的声明: 就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上. 有的时候不写声明函数也是可以执行的,但是把函数定义写在函数调用之后就会有提示甚至报错. 函 ...

  7. python内置函数调用_Python中函数的基本定义与调用及内置函数详解

    前言 函数function是python编程核心内容之一,也是比较重要的一块.首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有 ...

  8. python函数定义及调用-Python函数的基本定义和调用以及内置函数

    首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...

  9. button执行onclick函数_千万别再一直无脑使用ES6的箭头函数了,它虽然很有用但并不是万能的...

    相信很多小伙伴自从知道了ES6的箭头函数以后,都疯狂得使用,渐渐的淡忘了普通函数的使用.不过确实,箭头函数看起来比较简洁,用起来也舒服,不过它的出现是为了解决某一部分问题的,并不是用来替代普通函数的, ...

  10. js自动点击button执行onclick操作

    <script type="text/javascript"> //一秒后模拟点击setTimeout(function() {// IEif(document.all ...

最新文章

  1. 【c语言】数组逆序排列
  2. 约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题
  3. linux日志显示too many open files解决
  4. 深入了解以太坊虚拟机第5部分——一个新合约被创建后会发生什么
  5. boost::fusion::push_front用法的测试程序
  6. react常用知识点总结
  7. 任正非:华为100%没有后门,没想到美国打击华为决心这么大
  8. AttributeError: ‘str‘ object has no attribute ‘copy
  9. 2013 年亚洲赛杭州赛区卡题总结
  10. 2G3G要退网了,但没必要着急换5G手机
  11. matlab求解联名方程组带三角函数的,matlab三角函数方程组
  12. GitHub 近两万 Star,无需编码,可一键生成前后端代码,开源项目
  13. 转:钉钉群直播提取视频文件-电脑版
  14. 计算机图形学中需要掌握的数学基础知识有哪些?
  15. 杨桃文案:卖杨桃水果怎样写文案发朋友圈,水果店杨桃活动文案
  16. 使用容联云通信实现发送验证码
  17. 使用jquery判断是否为数字
  18. jsplumb插件学习--单个节点动态添加多个锚点
  19. 机器学习笔记 - 特殊类型的矩阵和向量
  20. 【机器学习笔记】可解释机器学习-学习笔记 Interpretable Machine Learning (Deep Learning)

热门文章

  1. keepalived实现LVS-DR模型的高可用
  2. Openstack安装(1)--keystone安装
  3. JDK的Proxy技术实现AOP,InvocationHandler和Proxy详解——Spring AOP(三)
  4. rpm包常见的格式详解
  5. android布局共享,android布局属性详解分享
  6. cookie登录_使用UserAgent和Cookie安全登录Facebook账号[安全买号必读]
  7. python 输入参数有误_Python OpenCV错误:输入参数的大小不匹配
  8. php 获取文件名 行号,PHP – 找到文件中的字符串,然后显示它的行号
  9. mac上键盘说明以及intellij 快捷键的使用
  10. wxpython安装不上怎么回事_安装Python - wxPython失败的解决方法