Точка путаницы на # 1 заключается в том, что функция выполняется как выражение функции. Функция действительна (поэтому она передает оператор if как правдивый), но это не оператор функции, поэтому для него не создается внешняя ссылка f
.
Это та же концепция, что и при назначении функции переменной: вы создаете выражение функции.
var g = function(){};
Именование выражение функции не меняет, что:
var g = function f(){};
// it would still only be externally accessible as g, not f
Было бы только доступным, как f
внутри функции:
var g = function f(){ alert(f); };
g(); // will call the function, and from inside f will work
Чтобы f
как функция (вместо выражения) он должен быть определен сам по себе в пределах его текущего объема, например:
function f() {}
// now we can reference it as f externally as a statement!
даже только один символ в пути, и это становится выражением вместо ...
!function f() {}
// now we can't :(
Для # 2, довольно просто: удалить для свойства объекта. Такие как:
var obj = {};
obj.foo = 'bar';
delete obj.foo;
alert(obj.hasOwnProperty('foo')); // <- false
Большое спасибо за эту полезную информацию! – Kelvin