将匿名函数分配给javascript中的变量

时间:2019-07-13 16:55:11

标签: javascript

我正在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。 请纠正我哪里我做错了,还有什么我需要知道的。谢谢。

4 个答案:

答案 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属性。

enter image description here