js 函数中的 this 问题

昨天做了百度的前端笔试题,其中有一个问输出结果的题,感觉有点懵,平时js是用到哪看到哪,没有研究这么深入。现在整理一下。

题目:

var myObject={
    foo : "",
    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 );
    }());
}

之前理解有点偏差,记得函数function也是对象,{}也是对象,所以一开始认定func这个成员方法中的this应该指的是这个函数自身,而这个函数中没有foo,所以应该是undefined。

后来感觉不对,如果这么搞,这个题输出就全部是undefined,就没意义了。

后来改为认定成员方法中this访问的是包含它的对象。而这个对象中没有foo,就根据作用于链向上找,就能找到外面定义的foo,值为bar。那么结果就是bar,bar,bar,undefined

回来一查,完全错了!

写了段代码验证一下

var a = "1";

var tObj = {

  a : "2",

  tFunc : function (){
    var a = "3";

    alert(this.a)
  }
}

tObj.tFunc();

发现弹出2,说明成员方法中的this指向的是包含它的对象!

注释掉一行代码:

var a = "1";
var tObj = {

  //a : "2",

  tFunc : function (){
    var a = "3";

    alert(this.a)
  }
}

tObj.tFunc();

弹出undefined,说明this对象引用的成员变量仅限于自身定义的变量,不会根据作用域链向上调用!(形成作用域链的是直接引用,而非通过this!)

时间: 2024-12-30 15:35:03

js 函数中的 this 问题的相关文章

js函数中获得当前被点击元素

问题描述:在html页面中点击<a>或者’按钮‘,进入js中的函数,在js函数中获得被点击那个<a>或‘按钮’元素 解决方法:方法一: html中: <a>标签:<a id="21" href="javascript:void(0);" onClick="fun(event)">点击我</a> 按钮:<input type="button" value=&quo

在JS函数中执行C#中的函数、字段

1.调用字段 cs文件的代码: public int id = 0; protected void Page_Load(object sender, EventArgs e) { id = 2; } js页面的代码: function CheckFunc() { alert("<%= id%>"); } 2.调用函数: 在JS函数中访问或执行C#.NET中的函数: 在JS函数中访问C#函数方法一: 首先建立一个按钮,在后台将调用或处理的内容写入button_click中;接

js函数中参数的传递

先看一道JS的笔试题: var setObj=function(o){ o.name="xiaoming"; o={}; o.name="xiaohong"; } var p={name:"xixi",age:24}; setObj(p); console.log(p); 答案是{name:xiaoming,age24}: 在JavaScript中函数参数默认为引用类型. 在阅读本章节之前建议参阅一下两章节:1.值类型可以参阅javascript

js函数中this的不同含义

1.js函数调用过程中,js线程会进入新的执行环境并创建该环境的变量对象,初始化变量对象时会自动添加两个变量:this和arguments,因此可以在函数中使用这两个变量.需要注意的是,this变量不能重新赋值,而arguments可以,如下: function test() { var name = 'test2'; arguments = window; this = window; // 在这一行js运行会报错 } 2.this取值于函数据以执行的函数对象 2.1 当函数在全局作用域执行时

js函数中的this关键字

关于这个this关键字,也是很多项目中常常被用到的,那么,有人也许会问,干嘛要用this呢,在函数被调用时,直接指明是什么对象在调用不就行了?还整那么个模模糊糊的概念出来干嘛?不过嘛,存在即真理,既然有这么个东西,那也就有他存在的意义,下面来看看吧. 首先,我们要先回忆一下js函数都有哪几种调用的场合,有如下几种场合: 1.很常规的调用(即直接调用,其实你发现也是全局调用): 2.作为某个对象的豆哥方法被调用: 3.作为构造函数,用来新建某个新对象(object): 4.很让人头大的apply调

JS 函数中的arguments,call,apply

JS 函数定义的时候的参数和调用时的关系调用时实际传递的参数可以比定义的参数多或者少,见下面的两个例子 <script> function test(a,b,c){ console.log(a); } test('a'); test('a','b','c'); </script> <script> function test(a){ console.log(a); } test('a'); test('a','b','c'); </script> JS的方法

JS函数中的参数传递

数据类型    在 javascript 中数据类型可以分为两类: 基本类型值 primitive type,比如Undefined,Null,Boolean,Number,String. 引用类型值,也就是对象类型 Object type,比如Object,Array,Function,Date等. 变量的复制 众所周知,js中变量的基本类型和引用类型保存方式是不同的,这也就导致变量复制时也就不同了.如果从一个变量向另一个变量复制基本类型的值时,会将前者的值克隆一个,然后将克隆的值赋值到后者,

前端js函数中直接获取springmvc后台model中传值

背景:使用springboot +springmvc +thymeleaf想在前端js中直接获取后台model传的值 有两种方式: 1.使用隐藏域,先把model的值通过标签的方式放到某个input标签下,再到js中通过jquery按照id的方式选取(这种方法对于对象类型的传值支持不好,字符串什么的还可以) 1.后台传值: model.addAttribute("roles", allRoleInfos); 2.前台隐藏域接收: <input type="hidden&

js函数中this的指向

本文是我个人对this指向的一些理解,如有不足之处,还望大家可以批评指正,在此先谢过了! 首先,我们来回顾一下ES5里函数的几种调用方式: 1??直接调用 foo(); 2??方法调用 obj.foo(); 以上两种调用方法,this的指向可以这样去确定: 函数的调用者就是this的指向! 例如 obj.foo(); 里.foo()前面obj就是调用者,所以this的指向就是obj,而直接调用的foo()等价于window.foo();这样的话,上面两种调用方法的this指向就显而易见了,1??