почему область указателя "this" в javascript ограничена? - PullRequest
0 голосов
/ 29 января 2012

Область действия или видимость указателя this, который называется w.r.t div, ограничивается функцией, для которой он предназначен, а не функциями NESTED.

Но все локальные переменные этой функции видны во вложенных функциях - почему это происходит ?? .. получение указателя this посредством вызова функции с <function name>(this) на div - не значит ли это даже указанный this также является локальной переменной в <function name>

Короче, вот код, который смутил меня ..

<html>
<script type="text/javascript" >
    function tst1(){
    setTimeout(
    function (){
    alert(this.id)
    }, 2000)
    }
    function tst2(){
    var elem = this
    setTimeout(
    function (){
    alert(elem.id)
    }, 2000)
    }
</script>
<style type="text/css">
    .test{
    margin: 40px 100px;
    background-color: green;
    width: 200px;
    line-height: 40px;
    text-align: center;
    height: 40px;
    }
</style>
<div id="fooBar"  class="test" onclick="tst1.call(this)"> Emily Rossum</div>
<div id="chickenRun" class="test" onclick="tst2.call(this)"> Emily Rossum</div>
</html>

В tst1 function переменная this равна null, но локальная переменная этой функции должна быть видна во вложенных функциях, как показано в tst2.

Я читал о замыканиях, так как функция вызывается позже - через setTimeout даже после того, как возвращаются tst1 и tst2 - разве функции не являются замыканиями? (Если это так, то, что переменная в родительской функции должна быть видна во вложенной функции, не так ли?)

1 Ответ

2 голосов
/ 29 января 2012

Переменная this в javascript отличается от других переменных тем, что она всегда специфична для конкретного вызова функции.По сути, существует один this для каждого вызова функции, и это не обязательно, хотя это может быть тот же this, который использовался во внешней функции.

Если вы хотите сохранить внешний this для использования во внутренних функциях, сохраните его в локальном режиме.

var outer = function () { 
  var self = this;  // Save current 'this' in a local
  var inner = function () { 
    self.name;  // refers to the original outer 'this.name' 
    ...
  };
  ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...