JavaScript-改变this指向
一、this指向的详解
概括:this的指向到底是指向哪里?通常来说,只有当函数执行的时候才可以确定this指向的到底是谁,简单的也可以这么说:this最终指向的是那个调用它的对象。
常见的一般有以下几种情况:
第一种:在一个函数中有this,但是函数没有被上一级对象所调用,所以此时的this指向的是window(注意在严格模式下则不是),如以下代码:
function blue() {
var blue = "蓝源";
console.log(this.blue);//undefind
console.log(this);//window
}
blue();//this指向调用它的那个对象,在这里相当于window
第二种:在函数中有一个this,而且该函数被上一级对象所调用,所以此时的this指向的是调用该函数的上一级对象,如以下代码:
var o = {
name: "blue",
fn: function(){
console.log(this.name);//blue
console.log(this);//指向o对象
}
}
o.fn();//此时this指向的是调用函数的对象o。
第三种:有一个函数中有this,函数中有多个对象,尽管这个函数是被最外层的对象调用,但是其中的this指向的只是它的上一级对象,如以下代码:
var o = {
name: "blue",
a: {
fn: function(){
console.log(this.name);//undefind,这里有两个对象o和a,调用的时候都指向上一层对象a,这里找不到声明的name
}
},
fn1: function(){
console.log(this.name);//blue
}
}
o.fn1();
o.a.fn();
第四种(特殊情况):如果函数中有return,而且return返回的是一个对象,那么调用时候的this指向不再是指向调用这个函数的实例了,而是指向这个函数返回的对象,如以下代码:
function fn()
{
this.name = 'blue';
return {};
}
var a = new fn;
console.log(a.name); //undefined,这里指向的是return返回的对象,是一个空对象
二、改变this指向的方法
第一种:使用call()
var a = {
user:"blue",
fn:function(){
console.log(this.user); //blue
}
}
var b = a.fn;
b.call(a); //若不用call,则b()执行后this指的是Window对象
call方法除了第一个参数以外还可以添加多个参数,如下:
var a = {
user:"blue",
fn:function(c,d){
console.log(this.user); //blue
console.log(e+ee); //3
}
}
var b = a.fn;
b.call(a,1,2);
第二种:使用apply()
var a = {
user:"blue",
fn:function(){
console.log(this.user); //blue
}
}
var b = a.fn;
b.apply(a);
apply方法和call方法很类似,也可以接收多个参数,但是第二个参数必须是数组,如下:
var a = {
user:"blue",
fn:function(e,ee){
console.log(this.user); //blue
console.log(c+d); //11
}
}
var b = a.fn;
b.apply(a,[10,1]);
第三种:使用bind()
bind和call,apply的使用方法有些不同,如果我们还是按照上面的方法写代码,会发现一些问题,如下:
var a = {
user:"blue",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
b.bind(a); //代码没有被打印
为什么代码没有被打印呢?这就是不同的地方所在,实际上执行bind之后返回的是一个函数,想下面这样写才是正确的:
var a = {
user:"blue",
fn:function(){
console.log(this.user); //blue
}
}
var b = a.fn;
var c = b.bind(a);
c();
bind()方法也可以接收多个参数,并且参数可以执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行的,如下:
var a = {
user:"blue",
fn:function(e,d,f){
console.log(this.user); //blue
console.log(e,d,f); //10 1 2
}
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);
总结:
call(),apply()以及bind()方法都可以改变this指向,只是所使用的场景有点不一样,bind()改变后的函数想什么时候调用就什么时候调用,call和apply都是改变指向后立即调用此方法。
JavaScript-改变this指向的更多相关文章
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- $.on()方法和addEventListener改变this指向
jQuery $.on()方法和addEventListener改变this指向 标签(空格分隔): jQuery JavaScript jQuery $.on() jq的绑定事件使用$([selec ...
- setTimeout改变this指向(****************************************)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 前端js中this指向及改变this指向的方法
js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...
- this(this的4种指向和改变this指向的方式)
this是Javascript语言的一个关键字. 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 1.this指向的形式4种 a.如果是 ...
- javascript中this指向的问题
javascript中this只有函数执行时候才能确定到底指向谁,实际this最终指向是那个调用它的对象. 1,匿名函数中的this——window function foo(){ var lastN ...
- JS中this指向问题和改变this指向
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- Javasript中this指向问题和改变this指向的方法
在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...
- 可以改变this指向的方法
this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...
- 图解javascript中this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...
随机推荐
- 二分练习题2 查找大于等于x的最小元素 题解
题目描述 现在告诉你一个长度为 \(n\) 的有序数组 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次询问,每次询问会给你一个数 \(x\) ,对于每次询问,你需要输出数组 \( ...
- Python--使用四种随机方法(Random)来产生随机价格
import random # 卖橘子的计算器:写一段代码,提示用户输入橘子的价格,# 然后随机生成购买的斤数(5到10斤之间),最后计算出应该支付的金额! # 第一种# orange_price = ...
- 为什么使用B+Tree索引?
什么是索引? 索引是一种数据结构,具体表现在查找算法上. 索引目的 提高查询效率 [类比字典和借书] 如果要查"mysql"这个单词,我们肯定需要定位到m字母,然后从下往下找到y字 ...
- 01 (H5*) Vue第一天
目录 1:什么是Vue.js 2:MVC和MVVM. 3:为什么要学习前段框架 4:框架和库的区别 5:怎么使用Vue. 6:常见的Vue指令 7: 五大事件修饰符 8:在vue中使用class样式 ...
- Docker常用命令小记
除了基本的docker pull.docker image.docker ps,还有一些命令及参数也很重要,在此记录下来避免遗忘. 环境信息 以下是本次操作的环境: 操作系统:CentOS Linux ...
- 查看mysql中的用户和密码
use mysql; select host,user,password from user; 设置密码 set password for root@localhost=password('root' ...
- Kilani and the Game-吉拉尼的游戏 CodeForce#1105d 模拟 搜索
题目链接:Kilani and the Game 题目原文 Kilani is playing a game with his friends. This game can be represente ...
- 学习WEBAPI第一天
目录 WebApi: 通过操作对象来实现操作标签的目的 一.DOM 中常用的操作 二.doucument对象 三.获取元素 四.注册事件 五.操作元素的属性 六.当页面加载完时,script代码已经执 ...
- 【Python】机器学习之单变量线性回归练习(计算Cost Function)
注:练习来自于吴恩达机器学习 翻译后的题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方),数据中包括不同的城市人口数和该城市带来的利润.第一列是城市的人口数,第 ...
- 在window里面安装ubuntu子系统并安装图形化界面
一.开启windows子系统 1. 在win10设置里面开启开发人员选项 (设置-->更新安全--> 开发者选项 )选择开启 2.在控制面板里面开启windows子系统 (启用或关闭wi ...