js修改函数内部的this指向


在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向.

默认在浏览器下script标签内定义的函数,调用的时候函数内部的this指向window(浏览器窗口对象)

<script>
var a=2
function hello(){
console.log(this)
console.log(this.a)
}
hello()
//输出: window => object
//输出: 2
</script>

  

使用bind来修改内部的this指向 bind(option) 函数内部的this指向option这个对象

<script>
var a=2
var obj={
a:"a"
}
function hello(){
console.log(this)
console.log(this.a)
}
hello=hello.bind(obj)
hello()
//输出: obj => { a:'a' }
//输出: 'a'
</script>

  

使用call来修改内部的this指向 call(option) 函数内部的this指向option这个对象

var a=2
var obj={
a:"a"
}
function hello(){
console.log(this)
console.log(this.a)
}
hello.call(obj)
//输出: obj => { a:'a' }
//输出: 'a'

  

使用apply来修改内部的this指向 apply(option) 函数内部的this指向option这个对象

var a=2
var obj={
a:"a"
}
function hello(){
console.log(this)
console.log(this.a)
}
hello.apply(obj)
//输出: obj => { a:'a' }
//输出: 'a'

  

bind ,call ,apply 的区别

  • bind是只改变函数内部this指向,但不自调用
  • call,apply 改变函数内部指向并且自调用
  • call第一个参数是需要指向的对象,之后的参数是函数内部的形参可以访问
  • apply第一个参数是需要指向的对象,第二个参数是数组格式,函数内部的形参可以访问
//call
var a = 2
var obj={
a:'a'
}
function hello(a, b, c) {
console.log(this)
console.log(a, b, c)
}
hello.call(obj,1,2,3) // { a:'a' } 1,2,3 //apply
var a = 2
var obj={
a:'a'
}
function hello(a, b, c) {
console.log(this)
console.log(a, b, c)
}
hello.apply(obj,[1,2],3,4) // { a:'a' } 1,2,undefind,undefind

  

js修改函数内部的this指向(bind,call,apply)的更多相关文章

  1. js函数( 普通函数、箭头函数 ) 内部this的指向

    - 普通函数   | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...

  2. JS回调函数中的this指向(详细)

    首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun()     fun中的this->obj,自动指向.前的对 ...

  3. 如何改变函数内部 this 的指向

    一.函数内 this 的指向 1. this 的指向是当调用函数时确定的,调用的方式不同,this 的指向也就不同. 1.1 this 一般是指向调用者. 函数类型 this 的指向 普通函数 Win ...

  4. JS中函数的 this 各种指向

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 情形1:如果一个函数中有this,但是它没有被上一级的对象所调用, ...

  5. python中修改函数内部的变量会发生什么

    最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...

  6. 改变javascript函数内部this指针指向的三种方法

    在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...

  7. JS高级 — 函数中的this指向问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. 作用域链和函数内部this指向问题以及bind、call、apply方法

    作用域链和函数内部this指向问题以及bind.call.apply方法 作用域链 作用域是相对于变量而言的, 其意义就在与查找变量(确定变量的来处, 变量是否可以访问到, 确定变量在当前位置是否可以 ...

  9. this的指向问题 call apply bind 中的this

    在函数中this指向谁:     函数中的this指向谁,是由函数被调用的那一刻就确定下来的 平时确定一个函数中的this是谁,我们需要通过调用模式来确定 1. 函数调用模式 this ---> ...

随机推荐

  1. Java实现 LeetCode 86 分割链表

    86. 分隔链表 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1 ...

  2. java实现杨辉三角系数

    ** 杨辉三角系数** (a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1, 1 3 3 1,1 4 6 4 1.这些系数构成了著名的杨辉三角形: 1 1 1 1 ...

  3. Java实现第九届蓝桥杯第几天

    第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. import java.util.Cal ...

  4. java实现第七届蓝桥杯分小组

    分小组 分小组 9名运动员参加比赛,需要分3组进行预赛. 有哪些分组的方案呢? 我们标记运动员为 A,B,C,... I 下面的程序列出了所有的分组方法. 该程序的正常输出为: ABC DEF GHI ...

  5. MongoDB 4.X CRUD基本操作

    本文总结了MongoDB 4.X在mongo shell客户端涉及的对文档一些基本的增删改查操作,即CRUD操作.主要结合了自己平时使用MongoDB的操作命令,更详细的命令可以参考官方文档: htt ...

  6. struts用action的属性接收参数

    新建一个javaweb项目 在项目中加入Struts.xml( 选中项目右键MyEclipse-->project facets-->Struts2-->finish) 在src项目 ...

  7. 第一章02-异常情况下Activity的生命周期

    异常情况下的生命周期分析 1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建 比如,屏幕旋转,默认情况下Activity会被销毁并且重新创建,不过我们也可以阻止系统重新创建我们的Ac ...

  8. Docker——基于Docker安装Drupal博客系统

    Docker--基于Docker安装Drupal博客系统 向脚本文件追加内容 cat << EOF > build.sh #设置主机名 hostnamectl set-hostnam ...

  9. Redis PHP扩展安装步骤

    ### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...

  10. WPF 如何流畅地滚动ScrollViewer 简单实现下

    看了看原生UWP的ScrollViewer,滑动很流畅(例如 开始菜单),但是WPF自带的ScrollViewer滚动十分生硬.. 突发奇想,今天来实现一个流畅滚动的ScrollViewer. 一.目 ...