JavaScript中匿名函数this指向问题

this对象是在运行时基于函数执行环境绑定的,在全局函数中,this=window,在函数被作为某个对象的方法调用时,this等于这个对象。

但是匿名函数的执行环境是全局性的,所以匿名函数的this指向是window

    var name = ‘window‘
    var person = {
        name :‘Alan‘,
        sayName:function () {
            return function () {
                console.log(this.name)
            }
        }
    }
    person.sayName()()  // window 

这里sayName方法return了一个匿名函数,这个匿名函数中this指向window

解决方法还是有的,我们可以把外部作用域的this传递给匿名函数

    var name = ‘window‘
    var person = {
        name :‘Alan‘,
        sayName:function () {
            var that = this
            return function () {
                console.log(that.name)
            }
        }
    }
    person.sayName()()  // Alan

原文地址:https://www.cnblogs.com/showcase/p/10498790.html

时间: 2024-10-31 18:35:57

JavaScript中匿名函数this指向问题的相关文章

JavaScript中匿名函数的多种写法

匿名函数没有实际名字,也没有指针,怎么执行滴?  其实大家可以看看小括号的意义就应该可以理解.小括号有返回值,也就是小括号内的函数或者表达式的返回值,所以说小括号内的function返回值等于小括号的返回值,不难理解 (function(){})()可以将没有名字的函数执行了把- 关于匿名函数写法,很发散~ 最常见的用法: 代码如下: (function() { alert('water'); })(); 当然也可以带参数: 代码如下: (function(o) { alert(o); })('

Javascript中的函数(三)

一:概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法:function func1(…){…}var func2=function(…){…};var func3=function func4(…){…};var func5=new Function(

[JavaScript]JavaScript中的函数(1)

关于JavaScript中函数的学习: MDN 阮一峰老师的教程 关于函数的定义: 阮一峰老师:函数是一段可以反复调用的代码块.函数还能接受输入的参数,不同的参数会返回不同的值. MDN:Function 构造函数 创建一个新的Function对象. 在 JavaScript 中, 每个函数实际上都是一个Function对象. 函数的声明方式和name 函数的声明方式有目前来说有5种,每一个函数都有他的一个name属性(包括匿名函数),要注意. 具名函数 function fn(x,y) { c

JavaScript中的函数表达式

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点: 在代码中须出现在表达式的位置 有可选的函数名称 不会影响变量对象(VO) 在代码执行阶段创建 下面就通过一些例子来看看函数表达式的这四个特点. FE特点分析 例子一:在下面代码中,"add"是一个函数对象

JavaScript中的函数表达式及递归

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点: 在代码中须出现在表达式的位置 有可选的函数名称 不会影响变量对象(VO) 在代码执行阶段创建 下面就通过一些例子来看看函数表达式的这四个特点. 特点分析 例子一:在下面代码中,"add"是一个函数对象,&

JavaScript中的函数的两种定义方式

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /*I总结: 1.函数名可以做变量使用,可以赋值,可以传值 2.函数名当参数,传递给另一个函数 */ //==================js中函

JavaScript中的函数(一)

javaScript中的函数实际上是对象,每一个函数都是Function类型的实例,和其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也就是一个指向函数对象的指针,也就是函数对象的一个引用,因此一个函数可以有多个名字. 1.函数定义的方式: 1)使用函数声明定义函数: function sum(num1,num2){ return num1+num2; } 2)使用函数表达式定义函数:定义变量sum并将其初始化为一个函数,变量sum可以引用函数.要注意函数末尾有一个分号,和声明变

浅析 JavaScript 中的 函数 currying 柯里化

原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个

JavaScript中的函数声明和函数表达式

JavaScript 中定义函数的方式有两种,一种是函数声明,另一种是函数表达式.这两种定义方式之间有一些细微的差别. 1.函数声明: function 关键字 + 函数名字 + 函数体构成了函数声明,具体形式如下: function functionName(arg0, arg1, arg2) {   // function body } Firefox. Safari. Chrome 和 Opera 都给函数定义了一个非标准的 name 属性,通过这个属性可以访问到给函数指定的名字: ale