Вы наткнулись на ошибку в языке JScript, используемом в IE.
getMyPublicName: function getMyPublicName() {
...
},
Здесь значение function getMyPublicName()
является выражением встроенной функции, которому присвоен необязательный идентификатор getMyPublicName
, совпадающий с именем его свойства в владельце. (sayHello
опускает этот идентификатор.)
Что необязательный идентификатор должен делать в соответствии со стандартом ECMAScript, так это делать ссылку на функцию, видимую в области действия самого тела функции, под именем идентификатора getMyPublicName
. Это может быть использовано для создания анонимной встроенной функции, которая ссылается на себя (для рекурсии).
То, что на самом деле делает в IE, неправильно, делает функцию видимой под именем getMyPublicName
в родительской области (функция utils
). Поскольку он виден в этой области видимости, он становится видимым и для дочерней области функции sayHello
, что делает ваш код работающим, когда это не так, на самом деле.
Вы можете использовать this.
, чтобы правильно получить ссылку на getMyPublicName
, как предложил Дастин. В качестве альтернативы, если вы хотите избежать проблем с привязкой this
в JavaScript (например, потому что вы собираетесь передать функцию sayHello
в качестве делегата тайм-ауту или событию), вы можете предпочесть поместить публичные функции в родительская область тоже:
var utils = function() {
function getMyPrivateName() {
return "Caoimhin";
}
function getMyPublicName() {
return "Kevin";
}
function sayHello() {
document.writeln("hello " + getMyPublicName() + "<br/>");
document.writeln("hello " + getMyPrivateName() + "<br/>");
}
return {
messages: {
getMyPublicName: getMyPublicName,
sayHello: sayHello,
}
}
}();