为什么不能使用函数名称在 JavaScript 中检索属性
Why cannot use function name to retrieve property in JavaScript?
以下是代码
function add() {
var counter = 0;
this.num = 0;
function plus (){ return counter +=1;}
plus();
return counter;
}
console.log(add.num); //outputs :undefined
函数名称可以被视为函数对象的引用,因此 num 是添加函数对象的属性,输出可以是 0。但结果不是这样,为什么?
如果我将代码更改为:
function add() {
var counter = 0;
this.num = 0;
function plus (){ return counter +=1;}
plus();
return counter;
}
var obj = new add();
console.log(obj.num); //outputs : 0
它工作正常。谁能解释一下?很多谢谢。
this
是指函数的当前实例。 直到您使用new add()
创建新实例,这将引用window
对象。
add.num
将检查add
是否有名为 num
的属性。这是错误的,因为add
指的是函数定义而不是函数的实例/对象。
function add() {
var counter = 0;
this.num = 0;
function plus (){ return counter +=1;}
plus();
return counter;
}
console.log(add.num); //outputs :undefined because add=function(){};
而在另一种情况下,当您使用 new
创建对象时,它会返回一个具有所有公共属性的 JavaScript 对象。
/obj=Object{ num : 0};
function add() {
var counter = 0;
this.num = 0;
function plus (){ return counter +=1;}
plus();
return counter;
}
var obj = new add();
console.log(obj.num); //outputs : 0 because obj is {num:0}
小提琴演奏:http://jsfiddle.net/ZpVt9/76/
阅读JavaScript中的this
: MDN
当你做new add()
时,解释器会创建一个新的JavaScript对象/哈希,并将其绑定到函数中的this
变量。因此this
函数范围内是有效的。
当你不做一个new
你就是在没有上下文的情况下调用函数,所以在这种情况下this
是未定义的(在"使用严格"模式下)。
您可以使用 Function.apply/Function.call/Function.bind 将上下文显式传递给函数
函数内部的this
指向不同的对象,具体取决于函数的调用方式:
- 如果在全局上下文(在任何函数外部)中调用函数,则
this
指向全局对象(如果脚本在浏览器中执行,则window
全局对象)。console.log(this === window)
将输出 true。 -
如果在函数内部引用
this
,则取决于我们是否设置了严格模式。-
如果代码处于严格模式,那么除非我们明确地将其分配给某些东西,否则
this
将被undefined
。 -
如果代码未处于严格模式,则
this
将指向全局对象。(如果在浏览器中执行脚本,则再次window
)。
-
-
如果函数用作构造函数来创建新对象,则
this
指向正在创建的新对象。 -
如果函数用作对象方法,则调用指向对象方法
this
。
更多解释和示例在这里: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
每个函数都是 JavaScript 中的一个对象。但是,从上面的解释中可以看出,this
没有一种方式指向来自同一函数体的函数对象本身。因此,设置函数属性的唯一方法是直接将其分配给函数,而无需使用 this
。
还有另一种向函数添加属性的方法。这样做是一个非常糟糕的主意,因为以这种方式添加任何属性都会反映在所使用的所有函数中。每个函数都链接到Function.prototype
对象。因此,在此对象中添加任何属性都将反映在所有函数中。
Function.prototype.someProperty = 1;
//now try accessing it via any function object
console.log(add.someProperty); //should print 1 to console.
"num" 不是 "add" 函数的属性 是该函数创建和返回的对象的属性 如果你想将 num 添加到你的 add 函数中,你需要做
add.prototype.num=0;
并将其从对象定义中删除
- 无法使用javascript检索SPList项
- 如何使用Quickbase API和javascript检索、添加数据
- 有没有一种方法可以使用Javascript检索谷歌表单ITSELF(而不是电子表格)的数据
- Javascript-检索文件夹中文件的名称
- 由 JavaScript 检索的 Div 未显示在源代码中
- 无法使用javascript检索django序列化的json
- 为Google Matrix指定API密钥API Javascript检索用法
- 正在通过JavaScript检索设置
- 基于一个属性Javascript检索多个对象
- JavaScript 检索特定 ul 的大小
- JavaScript - 检索在外部 for 循环内生成的变量值
- 从 JavaScript 检索表单提交的状态
- 如何在iPad或平板电脑上使用Javascript检索区域格式
- 如何通过 Javascript 检索有关 SharePoint 中网站内容的数据
- 无法使用 JavaScript 检索 HTML 元素的类型
- 无法使用普通 JQuery/Javascript 检索输入字段的值
- 使用javascript检索嵌入视频的宽度
- 如何使用javascript检索有关mp3的信息
- 如何使用 JavaScript 检索多个 JSON 文件
- 是否可以仅使用javascript检索数据库详细信息