名称已在控制台中定义!?

时间:2015-05-04 10:30:37

标签: javascript

有人可以解释为什么这段代码会返回

  

""

在firebug控制台中

不要低估,认为这只是一个错字!:O 我很想知道为什么它不会抛出错误 !!!

function mds() {
  var {
    namex,
    score,
    className
  }
  = {
    namex: 'NAME',
    score: '10',
    className: 'Oop'
  };
  this.test = function () {
    return name;
  };
}
var x = new mds();
x.test()

我还希望了解有关此类变量映射(或链接)的更多详细信息?

更新:

我想知道为什么在控制台中使用"" 预定义名称

4 个答案:

答案 0 :(得分:2)

这里解释的JavaScript部分很简单。

执行此操作时:

  this.test = function () {
    return name;
  };

它将首先在函数name的范围内查找名为this.test()的变量。如果在那里找不到name,它也将检查父函数的范围。由于name也没有定义,因此它将在全局范围内查找window,并返回window.name的值,在本例中为空字符串。当您在控制台(或Firebug)中运行window.name时,您会看到此{name)。这很简单。

window.name的值是根据HTML标准中的定义决定的(不是根据ECMAScript规则)。 This MDN页面说:

  

window.name - 获取/设置窗口的名称。

在您的情况下,窗口的名称为空,因此您将获得空字符串。这是window.name为空的原因的简单解释。

如果您真的想了解window.name为什么在这里为空,您需要查看HTML Specification有关浏览上下文的内容。它表示window.name的值将是当前浏览上下文的名称

  

浏览上下文是将Document对象呈现给用户的环境。 (from the spec

例如,当您使用以下代码在HTML中创建链接时,target属性指定要在其中打开页面的目标浏览上下文。

<a href="page.html" target="TargetName">Click me</a>

请参阅此JSBin中的更多示例。

希望这有点帮助。阅读HTML规范以了解有关browsing contexts的更多信息。

答案 1 :(得分:1)

即使您运行以下代码,您也会得到&#34;&#34;。

function ha() {
return name;
}
ha();

返回&#34;&#34;与

无关
var {
    namex,
    score,
    className
  }
  = {
    namex: 'NAME',
    score: '10',
    className: 'Oop'
  };

测试它的另一种方法是,只需键入&#39; name&#39;按回车键进入。

  

&#34;&#34;

根据&#34; Krishna&#34;更新观察。

看起来名称是在控制台上下文中预定义的。因此,如果用户在范围内没有其他名称声明,则控制台将返回一个空字符串&#34;&#34;。如果用户声明了name =&#34; xyz&#34;然后返回xyz

答案 2 :(得分:1)

名称是合法的 窗口 属性。 Windows可以有名称。它们可能很有用。

如:

<a href="named.htm" target="namedWindow">Open a new window, with the name of namedWindow!</a>

...为了使这更加非正式,我们应该补充一点:带有命名目标的链接将在具有名称的现有窗口中打开或将如果不是,请创建一个具有给定名称的新名称。

因为“name”标记是窗口上下文的全局属性;说明:控制台中的 name 或脚本中的任何位置当然会返回一个空值(正确/接受的类型),即: string < / em>的。在这种情况下[意味着window.name尚未定义]空(“”)字符串是该属性的唯一正确值。

而窗口的未设置事件或任何DOM元素(如果存在)应该返回 null ,而不是 undefined 或者上帝禁止空字符串,因为它们(事件属性)期望功能;和函数是object类型,null表示一个空对象。

但是,html元素的未设置的内联事件属性应该返回一个空字符串(“”)。

答案 3 :(得分:0)

试试这个,

var {
  namex: name,
  score: score,
  className
} = {
  namex: 'NAME',
  score: '10',
  className: 'Oop'
};

实际上对象必须是键值对