JavaScript中this的用法 及 如何改变this的指向
要懂得JavaScript中this的用法,首先需要知道,JavaScript中的作用域相关知识。
var fun = function(){
var flag = 1;
console.log(flag);
}
var flag = 0;
fun();
console.log(flag);
首先看上面这段代码,结果 : 1 0
这个很好理解了,打印的函数内部 flag 的值为 1,全局打印 flag 的值为0。
那么再如果函数内部打印 this.flag 呢?
var fun = function(){
var flag = 1;
console.log(this.flag)
}
var flag = 0;
fun();
console.log(flag);
结果: 0 0
this.flag 指向的是当前作用域下的 flag 值,fun() 函数在全局调用,那么作用域便为全局,而全局的 flag 值为 0,遂打印的结果便为 0
那么接下来看看this在不同的几种情况下的指向问题
注意:函数内部的this不是在函数定义时决定的,而是在函数调用时决定的
1、普通的 函数调用方式,内部this指向window(普通函数调用等于window.fun())
function fun(){
console.log(this)
}
var fun = function(){
console.log(this)
}
var fun = function(){
var fun2 = function(){
console.log(this)
}
}
(function(){
console.log(this)
})()
fun()
2、定时器中的this指向window
setTimeout(function(){console.log(this)},1000)
3、构造函数中this的指向(通过new关键字调用才是构造函数)
// 在调用一个方法时,对象.方法名();方法内部this指向调用者
function Fun(name){
this.name = name
}
Student.prototype.fun = function(){
console.log(this.name)
}
var fn = new Fun('Bob')
fn.fun()
4、事件处理程序中,this指向事件源
document.onclick = function(){
console.log(this)
}
改变 this 的指向
1、call 方法:
语法:函数名.call(调用者,实参1,实参2……)
注意:当函数被借用时,会立即执行,并且函数体内this会指向借用者或调用者
function fun(name,age){
this.name = name
this.age = age
}
var obj = {}
fun.call(obj,'Bob',20) ; // 会立即执行一次函数,this指向obj
2、apply 方法:
语法:函数名.apply(调用者,[实参1,实参2……])
注意:当函数被借用时,会立即执行,并且函数体内this会指向借用者或调用者
function fun(name,age){
this.name = name
this.age = age
}
var obj = {}
fun.apply(obj,['Bob',20]) ; // 会立即执行一次函数,this指向obj
3、bind 方法:
语法:函数名.bind(调用者,实参1,实参2……)
注意:当函数被借用时,不会立即执行,会返回一个新的函数,并且新的函数需要我们自己调用
function fun(name,age){
this.name = name
this.age = age
}
var obj = {}
var newFun = fun.bind(obj,'Bob',20)
newFun()
改变 this 指向的 - 栗子
要求:伪数组运用数组的push方法:
// 数组与伪数组的相关知识准备 // 伪数组的特点: // a、伪数组是一个对象 // b、这个对象必须有一个 length 属性 // c、如果这个对象的 length 不为0,那么就要有按下标存储的数据 // d、伪数组没有数组才有的一些方法,比如 push shift 等
// 【伪数组】
var nums = {
0:'a',
1:'b',
2:'c',
3:'d',
length:4
}
// 借用数组中的 push 方法
Array.prototype.push.call(nums,'e','f')
JavaScript中this的用法 及 如何改变this的指向的更多相关文章
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- javascript中 try catch用法
javascript中 try catch用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-08-16我要评论 JS try catch语句一般在什么情况下使用?是必须使 ...
- 从函数调用的角度,探讨JavaScript中this的用法
js函数调用方式大概可分为:函数调用,构造器调用,call或apply,方法调用四种方式.下面结合一些基础概念和实测代码,从函数调用的角度,探讨JavaScript中this的用法. 1. new对函 ...
- JavaScript中this的用法详解
JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...
- 在HTML页面中实时获取新消息的方法 “JavaScript中的setInterval用法”
JavaScript中的setInterval用法(资料来源:博主---八神吻你 ) setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数 ...
- javaScript中with的用法
1 JavaScript中的with语句的作用是为逐级的对象访问提供命名空间式的速写方式, 也就是在指定的代码区域, 直接通过节点名称调用对象 初次接触到with用法,是这样一段代码: 1 2 3 4 ...
- javascript中的继承用法
本文实例汇总了javascript关于继承的用法,希望本文所述对大家的javascript程序设计有所帮助.分享给大家供大家参考.具体如下:代码如下: /** * 实现子类继承父类,但不会产生多余的属 ...
- JavaScript 中 this 的用法
在 JavaScript 中,this 是动态绑定,或称为运行期绑定的.一般而言,在Javascript中,this 指向函数执行时的当前对象. 由于其运行期绑定的特性,JavaScript 中的 t ...
- JavaScript中一些怪异用法的理解
引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaS ...
随机推荐
- mybatis运行原理
mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...
- vbs调用bat 隐藏bat运行时的黑框
//新建文本文件 ,保存为后缀为bat.如:startBAT.vbs public const vbQuote="""" temp="C:\A_WOR ...
- 笔记 : 将本地项目上传到GitHub
一.准备工作 1. 注册github账号https://github.com, 安装git工具 https://git-for-windows.github.io/ 2. 创建SSH KEY(由于本地 ...
- Git安装及创建版本库
一.在Windows上安装Git 1.虽然用于开发的系统最好是用Mac或者Linux,但绝大多数新人都是用Windows进行开发.Windows系统上也有提供了Git(Windows版),下载地址:h ...
- Nodejs【单机】多进程模式集群
Nodejs[单机]多进程模式集群实例: 1.安装:npm install -s cluster 2.服务代码: var debug = require('debug'); var express = ...
- python 翻译爬虫
import urllib.request import urllib.parse import json while 1: content=input("请输入要翻译的内容:") ...
- poj2987 求最大权闭合回路
建图差不多和以前做的差不多,就是最后询问这个闭合子图有多少个的时候,只要输出这个图的S集合,就是进行dfs能遍历到的点一定在S集合中,不能遍历到的点在T集合中 #include <iostrea ...
- uva 10163 Storage Keepers
题意: 有n个仓库,m个人,一个仓库只能由一个人托管,每个人可以托管多个仓库. 每个人有一个能力值a,如果说他托管了k个仓库,那么这些仓库的安全值都是a/k. 雇佣一个人的花费也是a. 如果一个仓库没 ...
- 压缩和解压缩(I)
ZipArchive 压缩方法 -(void)zipArchiveWithFiles { //创建解压缩对象 ZipArchive *zip = [[ZipArchive alloc]init]; / ...
- Python 第四阶段 学习记录之----多线程
多线程 多线程例子, 注释部份即为多线程的使用 #-*- coding: utf-8 -*- # Wind clear raise # 2017/3/5 下午2:34 import socket im ...