0 0

js闭包中this指向的问题10

下面是百度今年的一个笔试题:
var myObject = {
foo:"bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);

 (function (){
    console.log("inner func: this.foo = " + this.foo);
    console.log("inner func: self.foo = " + self.foo);
 }());
}
}
myObject.func();

结果是 bar bar undefined bar
关于第三个undefined我是这样理解的:func是myObject对象的属性方法,所以其内部this指向myObject对象本身。而此属性方法内部的匿名立即执行函数是独立的,其this指向自身的执行上下文,引用不到外部的foo,所以是undefined。但由于作用域链使用self可以通过self引用到外部,所以第四个是bar。

我是这样理解的,并且我做了个推论:

function outer(){
this.i = 10;
alert(this.i);
(function(){
alert(this.i);
}());
};
outer();


按道理第二次弹出对话框是undefined才对,可是它却是10!它这里怎么又能通过this引用外部的i了呢?why?

请大神不吝赐教!
 
2014年10月12日 18:10

5个答案 按时间排序 按投票排序

0 0

采纳的答案

两个this都是指window.
function outer(){
this.i = 10;
alert(this === window)
alert(this.i);
(function(){
alert(this.i);
alert(this === window)
}());
};
outer();

想要出现undefined,改成new outer();

2014年10月13日 15:17
0 0

function outer(){
    console.log(this);
    (function(){
        console.log(this);
    }());
};
用这种方法自己尝试一下就出来了,拿到支持console的浏览器里面跑一下就出来了。

2014年10月19日 17:15
0 0

匿名函数都是window对象的,window都没有foo。
自身的执行上下文,这样说根本没说到点上。

2014年10月14日 17:36
0 0

任务而温热我认为二位 

2014年10月13日 17:13
0 0

你怎么不想想this指向的是哪?除了对象本身和window还能指向什么?
所以你第二段代码2个this指向的都是window

2014年10月13日 00:31

相关推荐

    JavaScript核心(对象、原型、继承、上下文、闭包、this).pdf

    在JavaScript中,this关键字是一个特殊的变量,它指向函数的执行上下文。在对象的方法中,this通常指向调用该方法的对象。但是,使用原型继承时,继承方法中使用的this的值是原始对象,而不是在其中查找方法的原型...

    js闭包理解

    在JavaScript中,`this`关键字的指向取决于函数的调用方式: 1. 作为对象方法调用时,`this`指向该对象。 2. 使用`new`关键字创建实例时,`this`指向新创建的对象。 3. 直接调用函数时,`this`通常指向全局对象(在...

    js中的this

    理解 `this` 的行为有助于避免常见的陷阱,如闭包中的 `this` 问题,以及在异步操作中可能出现的 `this` 指向问题。 总的来说,`this` 是 JavaScript 中一个关键的特性,它提供了对象间的关联和方法调用的上下文。...

    详解JS中定时器setInterval和setTImeout的this指向问题

    然而,`this`关键字在这些定时器函数中的指向问题常常会给初学者带来困扰。 在JavaScript中,`this`的值取决于它被调用的上下文。通常,如果函数是作为对象的方法调用,`this`将指向那个对象。但在`setTimeout`和`...

    javascript闭包高级教程

    ### JavaScript闭包高级教程 #### 简介 在JavaScript编程中,“闭包”是一个非常重要的概念,尤其对于希望深入理解和高效使用JavaScript的开发者来说。简单地说,闭包是一种能够记住并访问其创建时周围环境的函数...

    JavaScript闭包与活动.pdf

    `this`关键字在JavaScript中也是一个关键点,它指向函数调用时的上下文。`this`的值取决于函数如何被调用,而不是函数如何被定义。例如,`call`方法可以改变`this`的指向,就像`o1.fun.call(o2)`那样。 活动记录...

    教你如何使用firebug调试功能了解javascript闭包和this

    // 在getNameFunc内部,this指向obj对象 return function () { console.log(this.name); // 当这个匿名函数独立调用时,this仍然指向window }; } }; var c = obj.getNameFunc(); c(); // 输出 'The Window' ```...

    Angular.JS中的this指向详解

    Angular.JS中的this指向是JavaScript中this关键字在特定框架环境下的应用,由于JavaScript的作用域和this指针行为会根据不同的调用方式产生不同的绑定,了解这些规则对于开发Angular.JS应用至关重要。本文将详细介绍...

    WEB-面试题-第三阶段面试真题

    这个资源是关于WEB面试的第三阶段面试真题,涵盖了JavaScript高级知识点,包括构造函数、this指向、函数调用、闭包、setTimeout、apply等方面。下面是对每个问题的详细说明: 1. 构造函数和this指向: 在这个问题...

    聊一聊JS中this的指向问题

    在JavaScript中,`this`关键字是一个非常重要的概念,它的指向问题常常困扰初学者。`this`的值在不同的上下文中可能会有不同的指向,理解其工作原理是深入学习JS的基础。下面我们将详细探讨几种常见的`this`指向情况...

    关于JavaScript中的this指向问题总结篇

    JavaScript中的`this`关键字是一个非常重要的概念,它在不同场景下有不同的指向,常常困扰着开发者。...在实际开发中,常常需要利用闭包或保存`this`的引用(如使用`that`、`self`等变量)来解决`this`指向问题。

    js绑定事件this指向发生改变的问题解决方法

    在JavaScript中,事件处理函数中的`this`关键字常常会因为不同的绑定方式而指向不同的对象,导致运行时出现不符合预期的结果。通常情况下,我们使用`.bind`、`.call`或`.apply`方法来明确指定函数内部`this`的指向。...

    详细讲解JavaScript中的this绑定

    `this`在JavaScript中并不像其他语言中的`this`那样简单地指向对象本身,而是根据函数调用的方式动态确定其指向。理解`this`的工作方式对于编写高质量的JavaScript代码至关重要。 1. **默认绑定**: - 当函数被...

    js代码-测试this指向问题 (页面环境下和node环境下还是不同)

    在`main.js`文件中,可能包含了对`this`指向问题的测试代码,通过各种调用方式来验证`this`在不同环境下的行为。`README.txt`文件可能解释了测试的目的和如何运行测试。 总的来说,理解`this`的指向是掌握...

    闭包作用域

    #### 一、JavaScript闭包简介 在JavaScript中,闭包(Closure)是一个非常重要的概念,它允许一个函数访问并操作其外部作用域中的变量,即使该函数在其外部作用域之外被调用。这种特性使得闭包成为一种强大的工具,...

    js闭包是什么?.pdf

    闭包是JavaScript中的一个核心概念,对于理解函数式编程以及JavaScript中的作用域和变量访问机制至关重要。 闭包(Closure)是函数和声明该函数的词法环境的组合。简单来说,一个闭包允许一个函数访问并操作函数...

    基于javaScript的this指向总结

    JavaScript中的`this`关键字是一个非常重要的概念,它在不同场景下的指向可能会有所不同,这使得理解和掌握`this`的用法成为前端开发人员必备的技能。本文将深入探讨`this`在JavaScript中的各种情况下的指向。 1. ...

    详解vue中的computed的this指向问题

    在Vue.js框架中,`computed`属性是用来定义基于其他数据属性计算得出的值。它提供了一种便捷的方式来处理数据,并且这些计算结果会被缓存,只有当依赖的属性发生变化时才会重新计算。然而,在使用`computed`时,尤其...

    javascript 避免闭包引发的问题

    在事件触发时,使用this关键字可以引用到事件触发时的元素,因为在事件处理函数中,this通常指向触发事件的元素。这样就不需要依赖于外部循环变量i的值了。例如: ```javascript for(var i = 0; i ; i++) { var ...

    js中this用法实例详解

    2. 指向该对象(在全局里面this指向window,在某个对象里面this指向该对象,在闭包里面this指向window) var user="the Window"; var box={ user:'the box', getThis:function(){ return this.user;

Global site tag (gtag.js) - Google Analytics