Javascript eval() не работает с window.external.notify(), работает с window.alert()

В WP8, если я выполняю (1):

Microsoft.Phone.WebBrowser wb;
wb.InvokeScript("eval", "window.external.notify('abc');");

Он выдает "цель вызова, возвращал ошибку", неизвестную ошибку, hresult 80020101. Но (2)

wb.InvokeScript("eval", "window.alert('abc');");

работает нормально и отображает окно сообщения.

И (3)

wb.InvokeScript("eval", "( function (){window.external.notify('abc');})();");

Также отлично работает.

Мой вопрос: что это такое о window.external.notify(), которое не позволяет eval напрямую ссылаться на него? Это вызов функции, такой как window.alert(), поэтому он должен быть действительным script. Но если в 1) есть что-то особенное в неприкрашенном вызове, то почему обернутый вызов в 3) работает?

Я понимаю, что eval() является корнем всего зла, и я прочитал другие сообщения SO, связанные с проблемами eval() с определением функции. (Где мы все будем без SO?) Но это явно другая проблема.

Ответ 1

Я думаю, что это связано с контекстом вызова, что eval(...).

Если вы вызываете eval("window.external.notify('abc');"), script должен быть вызван в глобальном контексте window.

Вы можете проверить контекст, как показано ниже, для подбора текущего контекста:
eval("console.log(this); window.external.notify('abc');")

Затем попробуйте протестировать эти 3 способа проверить, есть ли разница в контексте.

Чтобы указать один контекст для запуска, вы можете использовать call или apply для установки контекста с первым параметром.

Ответ 2

Для выполнения кода JavaScript в WebView с С# используйте InvokeScript и получая значения из функций java script в С#, используйте window.external.notify в функции java script. для улова значения в С# из java script функции используют следующий код.

private void Web_OnScriptNotify(object sender, NotifyEventArgs e)
{
    Debug.WriteLine("Called from ScriptNotify! {0}", new[] { e.Value });
}