函数直接调用和通过对象属性obj.myFunc()是不同的,它叫做方法调用method invocation(后边介绍的第2种类型)。比如[1,5].join(',')这种不是一个函数直接调用,而是方法调用。这两种是最容易混淆的,需要特别注意。 此外,一个IIFE(immediately-invoked function expression)也属于函数直接调用。 代码语言:javascript 代码...
但在JavaScript 中情况就比较复杂了:this 指向当前函数调用的执行上下文(context),有四种函数调用类型: 函数直接调用(function invocation:alert('Hello World!') 方法调用(method invocation:console.log('Hello World!') 构造函数调用(constructor invocation:new RegExp('\\d') 间接调用(indirect invocation:alert.ca...
由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:作为函数调用,作为对象方法调用,作为构造函数调用,和使用 apply 或 call 调用。下面我们将按照调用方式的不同,分别讨论 this 的含义 作为函数...
理解了这一点,你就会彻底理解this的作用。 二、内存的数据结构 JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系。 varobj={foo:5}; 上面的代码将一个对象赋值给变量obj。JavaScript 引擎会先在内存里面,生成一个对象{ foo: 5 },然后把这个对象的内存地址赋值给变量obj。 也就是说,变量obj是一个...
method.call( newThisContext, Param1, ..., Param N ) method.apply( newThisContext, [ Param1, ..., Param N ] ); 再看一个复杂一点的代码案例: <!DOCTYPE html> Changing Execution Context In JavaScript //Create a global variable for...
obj.method();//[object Object]:object//[object Window]:global//[object Window]:global call/apply/bind改变this this本身是不可变的,但是 JavaScript中提供了call/apply/bind三个函数来在函数调用时设置this的值。 这三个函数的原型如下: fun.apply(obj1 [, argsArray]) ...
In the above example,thisrefers to thepersonobject. 5. this Inside Inner Function When you accessthisinside an inner function (inside a method),thisrefers to the global object. For example, constperson = {name:'Jack',age:25,// this inside method// this refers to the object itselfgreet(...
method: function () { console.log(this); } }; parent.method(); // <- parent 注意这种行为非常“脆弱”,如果你获取一个方法的引用并且调用它,那么this的值不会是parent了,而是window全局对象。这让大多数开发者迷惑。 var parentless = parent.method; ...
sayHi; carSayHi(); // TypeError because the 'sayHi' method tries to access 'this.name', but 'this' is undefined in strict mode. 然而,请注意,自动绑定的方法遭受的问题与使用箭头函数作为类属性相同:类的每个实例都会有其方法的自己的副本,这会增加内存使用。只在绝对必要的地方使用它。你也可以模仿 ...
JavaScript中关于this的一个bug 让我们更进一步延伸来看这个范例: 假设我们在method log裡面多这一行this.name = "Updated Object C name" 因为我们知道”this”现在指的是对象c,所以可以想像的,当我执行这个method的时候,它会去变更c.name的值。 这个部分是没有什么大问题的,不过让我们继续看下去……。