Вы не можете ограничить область действия с помощью методов «вызов» или «применить», но вы можете использовать простой трюк, используя «eval» и scoping, чтобы скрыть какие-либо конкретные глобальные переменные от вызываемой функции .
Причина этого в том, что функция имеет доступ к «глобальным» переменным, которые объявлены в области, которую сама функция объявляет. Таким образом, скопировав код метода и введя его в eval, вы можете существенно изменить глобальную область функции, которую вы хотите вызвать. Конечный результат по существу заключается в том, что он может несколько изолировать фрагмент кода javascript.
Вот пример полного кода:
<html>
<head>
<title>This is the page title.</title>
<script>
function displayTitle()
{
alert(document.title);
}
function callMethod(method)
{
var code = "" +
// replace global "window" in the scope of the eval
"var window = {};" +
// replace global "document" in the scope of the eval
"var document = {}; " +
"(" +
// inject the Function you want to call into the eval
method.toString() +
// call the injected method
")();" +
"";
eval(code);
}
callMethod(displayTitle);
</script>
</head>
<body></body>
</html>
Код, который получает eval'd, выглядит следующим образом:
var window = {};
var document = {};
(function displayTitle()
{
alert(document.title);
})();