JavaScript中this指向问题(函数的调用方式)

  • 在ES6之前,函数内部的this是由函数的调用方式决定的
  1. 函数调用
var age = 18;
var p ={
	age : 15,
	say : function(){
		console.log(this.age)
}
		}
var f1 = p.say;
f1();
  •   这时是函数调用(是由window调用,即f1() = window.f1())。
    
  •   此时结果为18,因为this指向window。
    
  1. 方法调用
var age = 18;
var p ={
	age : 15,
	say : function(){
		console.log(this.age)
}
		}
p.say();
  •   方法调用,结果为15,这里的this指向p对象。
    
  1. new调用(构造函数)
	var age=18;
 	   var p={
        age : 15,
        say : function(){
            console.log(this.age);
        }
    }

     new p.say()
  •   构造函数调用
    
  •   这时 p.say 属于Object,为Object的实例
    
  •   this:say构造函数的实例,实例中并没有age属性,值为:undefined
    
  1. 上下文方式(call、apply、bind)
    function f1(){
        console.log(this);
    }

  //  call方法的第一个参数决定了函数内部的this的值

    f1.call([1,3,5])
    f1.call({age:20,height:1000})
    f1.call(1)
    f1.call("abc")
    f1.call(true);
    f1.call(null)
    f1.call(undefined);

上述代码可以用apply完全替换

示例 2
	 var obj = {
        name: "西瓜",
        eat: function() {
          setInterval(function() {
            console.log(this.name);
          }, 100);
        },
        hava: function() {
          setInterval((function() {
            console.log(this.name);
          }).bind(this), 100);
        },
        small:function(){
          setInterval(() => {
            console.log(this.name);
          }, 100);
        }
      };

总结: call方法的第一个参数: 1、如果是一个对象类型,那么函数内部的this指向该对象 2、如果是undefined、null,那么函数内部的this指向window 3、如果是数字-->this:对应的Number构造函数的实例 -- > 1 -- > new Number(1) 如果是字符串-- >this:String构造函数的实例 -- > "abc" -- > new String("abc") 如果是布尔值-- >this:Boolean构造函数的实例 -- > false -- > new Boolean(false) 在示例 2 中,依次为undefined, 西瓜,西瓜(ES6中箭头函数)。

来源:http://www.1994july.club/seojishu/

原文地址:https://www.cnblogs.com/1994jinnan/p/12203334.html

时间: 2024-10-28 22:10:19

JavaScript中this指向问题(函数的调用方式)的相关文章

javascript中的立即执行函数(function(){…})()

javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要

深入理解javascript中的立即执行函数(function(){…})()

这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){-})()包住业务代码,使用jquery时比较常见,需要的朋友可以参考下http://www.jb51.net/article/50967.htm javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( function()

JavaScript 中对变量和函数声明的提前示例

如题所示,看下面的示例(可以使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发者工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter可以中途代码换行) var name = "xiaoming"; (function(){ var name = name || "小张"; console.info(name); })();// 小张 (function(){ name = name || "小张";

JavaScript中的内置函数

JavaScript中的内置函数 制作人:全心全意 在使用JavaScript语言时,除了可以自定义函数之外,还可以使用JavaScript的内置函数,这些内置函数是由JavaScript语言自身提供的. JavaScript中的内置函数如下表所示: 函     数 说     明 eval() 求字符串中表达式的值 isFinite() 判断一个数值是否为无穷大 isNaN() 判断一个数值是否为NaN parseInt() 将字符串型转换为整型 parseFloat() 将字符串型转换为浮点

javascript中的立即执行函数

javascript中的立即执行函数$(function(){ alert();}()) Highcharts的中的 series:[{ name: '今日在线人数', color: 'pink', data: (function(){ )()) }] #执行效果一样$( document ).ready(function() { console.log( "ready!" ); }); 和 $(function() { console.log( "ready!"

JavaScript中四种不同的属性检测方式比较

JavaScript中四种不同的属性检测方式比较 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //false "toString" in o; //true,继承属性可以被检测到 "toString" in Object.prototype; //true,不可枚举的属性可以被检测到 2. hasOwnProperty()方法 var o = {x:1}; o.hasO

函数的调用方式:自右向左

#include<stdio.h> #include<math.h>//函数的调用方式:自右向左int main(){ int f(int a, int b); int i = 2, p; p = f(i, ++i); //关键点 printf("%d\n", p); while (1); return 0;} int f(int a, int b){ printf("%d\n", a); printf("%d\n", b

javascript中查看元素事件函数的一些技巧

在分析一些网页的时候,经常会发现点击某个按钮会触发某个动作,当页面比较复杂,包含的js文件又多,这时候要找到这段触发函数的代码写在哪里就比较困难.比如,在某个html页面中,发现如下一个按钮,点击后会使得页面元素有变化.但是并未看到onclick事件,那说明该事件可能是通过javascript中的addEventListener方法绑定的(IE不支持该方法,使用的是attachEvent,不理解为微软何非要和W3C标准对着干).例如下面的代码: <input type="button&qu

javascript中的this与函数讲解

前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码,都存放在Window函数内(这是个假设),也就是说javascript中只有函数作用域(前面假设做前提下). 作用域是什么 作用域是一个盒子,盒子内部的变量只能在当前盒子中使用,作用域盒子是可以嵌套的,内部盒子的变量对父级盒子是不可见的,因为盒子封闭了他们并且盒子不透明,但是盒子可以看到父级盒子内部