我正在Google Chrome浏览器上将此HTML代码作为html脚本标签运行。
<script type="text/javascript">
var bar=function() {
var name='tanzeel';
console.log('inside a function');
}
console.log('My name is ' +bar.name);
</script>
我来自java和cpp背景。我对oop的了解是,js中的函数被实例化为一个对象,这里的变量bar
指向该对象。因此,我可以访问该对象的所有属性。然后,为什么console.log('My name is ' +bar.name)
打印My name is bar
而不是字符串My name is tanzeel
。
请纠正我哪里我做错了,还有什么我需要知道的。谢谢。
答案 0 :(得分:3)
您的变量可能是“指向”(dat cpp lingo;))的对象,但是您不能随心所欲地对待该对象。在这种情况下,对象是一个函数,因此您不能将函数的主体视为具有常规类意义上的字段。
您得到的输出是函数的名称。
要进行此工作,必须使用new
关键字实例化该对象。您还必须为该类分配属性才能访问它们。
var bar=function() {
this.name='tanzeel';
//console.log('inside a function');
}
var b = new bar()
console.log(b.name);
答案 1 :(得分:2)
这里有两个独立的问题。
首先,函数是对象,可以具有属性。在函数范围内定义的变量完全与函数对象的属性不同。它们仅在函数运行时存在(尽管是闭包),并且直接引用 而不是与函数相关。
第二,函数可以具有名称。通常,这来自函数表达式中的显式名称:
var bar = function foo () { };
…但是自从几年前JS发生变化以来,匿名函数表达式从分配给它们的变量中获取名称。
var bar = function () { };
该函数内部有一个名为name
的变量与该函数具有一个名为name
的属性无关。
答案 2 :(得分:1)
将字符串ContinueWith
分配给变量tanzeel
时,不会更改bar函数的name
属性。相反,您只是在name
函数的词法环境中创建name
变量。
bar
语句中的 bar.name
求值为console.log
,因为该函数会推断it from it's syntactic position
答案 3 :(得分:1)
预期的行为是可以理解的。这是因为函数在javascript中被视为对象。每个对象都有一组属性。类似地,函数在其原型链中具有属性 name
,该属性的值为函数名称。在这里阅读更多:
https://developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/Global_Objects/Function/name
另外,请查看下图中的控制台。您可以在构造函数中看到一个name属性。