JavaScript中对象内部函数与外部普通函数的实际区别是什么?
JavaScript对象内部方法与外部函数的核心差异
你给出的示例中二者运行结果一致,是因为两个函数都硬编码引用了作用域下的
obme变量,绕过了对象方法默认的this绑定逻辑,属于特殊写法下的巧合,不是二者的通用表现。
二者的核心差异如下:
- 所属命名空间不同
对象内部定义的met是obme对象的专属成员,只会占用obme下的命名空间,你可以在其他对象、其他作用域下定义其他同名的met变量/函数,不会产生冲突。而全局定义的met函数会占用当前作用域的命名空间,同作用域下不能再定义同名的变量/函数,否则会产生覆盖。 this指向逻辑不同
对象方法的this默认绑定调用该方法的对象,你可以把同一个方法赋值给多个对象复用,方法执行时会自动读取调用者的属性,不用硬编码变量名。而外部函数的this默认绑定当前作用域的顶层对象(浏览器下为window,Node.js下为globalThis),本身和obme没有绑定关系,你示例中的写法属于手动硬编码引用obme,复用性极低。
可以修改代码直观看到差异:let obme = { a: 'Mus', b: 3, met: function (){ console.log(this.a, this.b); // 改用this指代调用对象,而非硬写obme } } // 把方法赋值给新对象 let newOb = {a: '测试值', b: 999} newOb.testMet = obme.met newOb.testMet() // 输出:测试值 999,自动读取调用者newOb的属性 // 外部函数 function met () { console.log(obme.a, obme.b); } newOb.testExtMet = met newOb.testExtMet() // 输出:Mus 3,永远读取固定的obme属性,和调用者无关- 面向对象能力支持不同
对象内部方法是JS面向对象封装的基础,结合类、构造函数可以批量生成多个属性独立、方法复用的实例,符合高内聚低耦合的开发规范。外部函数如果要实现同样的能力,需要手动传递实例参数,代码维护成本更高。
内容的提问来源于stack exchange,提问作者Aminu Barade
相关产品推荐
相关产品推荐

