2010-06-25 21 views

Respuesta

17

Para código global (código que no es parte de ninguna función), que son casi equivalente, tanto en el extremo crear una propiedad en el objeto global.

La diferencia es que a, que ha sido declarada con la declaración var, el proceso Variable Instantiation utilizará el objeto global como el objeto variable(1), y se definirá esa propiedad que no se puedan eliminar en que, por ejemplo:

var a = 13; 
delete a; // false 
typeof a; // "number" 

Entonces, dado que el valor bthis en código global, señala el propio objeto global, habrá también una propiedad global , pero éste puede ser eliminado:

this.b = 21; 
delete b; // true 
typeof b; // "undefined" 

No trate el primer fragmento de Firebug, desde la consola de Firebug ejecuta el código internamente con eval, y en este contexto de ejecución del proceso de creación de instancias variables comporta de manera diferente, se puede probar here.

(1) El objeto variable (VO) es un objeto que se utiliza por el proceso de instanciación variable para definir los identificadores de FunctionDeclarations, los identificadores declarados con los var declaraciones, y los identificadores de parámetros formales de la función, en el diferente execution contexts, todos esos identificadores están vinculados como propiedades del VO, la cadena del Alcance está formada por una lista de VO's.

Para el código global, el VO es el objeto global en sí, por eso a termina siendo una propiedad de él. Para código de función, el VO (también conocido como Activation Object para el Código de función), es un objeto nuevo creado detrás de escena cuando se invoca una función, y eso es lo que crea un nuevo alcance léxico, en resumen, hablaré sobre funciones.

Tanto a y this.b puede haber resolved simplemente como por a y b porque el primer objeto en la cadena de ámbito, es de nuevo el objeto global.

Además, creo que el trabajo es saber que el proceso de creación de instancias de variables se lleva a cabo antes de que la ejecución de código, por ejemplo:

alert(a); // undefined, it exists but has no value assigned to it yet 
alert(b); // ReferenceError is thrown 

var a = 13; 
this.b = 21; 

Estas diferencias pueden ser triviales, pero creo que vale la pena conocerlos.

Ahora, si el fragmento de código que publicó está dentro de una función, es completamente diferente.

El identificador a, declaró a la declaración var en su ejemplo será una variable local , disponible sólo para el ámbito léxico de la función (y cualquier funciones anidadas).

Tenga en cuenta que en los bloques de JavaScript que no introducen un nuevo ámbito, solamente funciones hacen, y para declarar una variable en ese ámbito, usted debe siempre uso var.

El this.b identificador se convertirá en una propiedad con destino al objeto que se conoce por el valor this, pero ... ¿Cuál es this ???.

El valor this en JavaScript se establece cuando se llama a una función implícita, que está determinada por cómo se invoca:

  1. Cuando se utiliza el operador new, el valor this dentro de la función, se apuntan a un nuevo objeto creado, por ejemplo:

    function Test() { 
        this.foo = "bar"; 
    } 
    var obj = new Test(); // a new object with a `foo` property 
    
  2. Cuando se llama a una función que es miembro de de un objeto, el this valor dentro de esa función apuntará al objeto base de, por ejemplo:

    var obj = { 
        foo: function() { 
        return this == obj; 
        } 
    }; 
    obj.foo(); // true 
    
  3. Cuando se invoca una función sin ningún tipo de objeto de base, el valor this se referirá al objeto global:

    function test() { 
        return this == window; 
    } 
    test(); // true 
    
  4. El valor this se puede configurar de forma explícita, cuando se invoca una función utilizando call o apply:

    function test() { 
        alert(this); 
    } 
    test.call("hello world!"); // alerts "hello world!" 
    
+0

1 sólo para esta explicación clara, he comprobado su perfil para ver si tenía un blog que he podido leer :) – Konerak

+0

1 para la plena respuesta muy agradable –

+0

+ 1 para una buena explicación, pero su primera línea es algo inexacta: una variable global no es lo mismo que una propiedad del objeto global, como luego se va a mostrar. Que declarar una variable con 'var' en el alcance global crea una propiedad del objeto global es un * efecto secundario * del hecho de que el objeto global se usa como el objeto Variable en el ámbito global. –

1

de entender en pocas palabras, si usted utiliza éstos en una función a continuación -

this.a; //will create a public property 

var b; //will create a member variable 

por ejemplo, aquí es una clase Estudiante en javascript

var Student = function() 
{ 
    // Member variable 
    var studentId; 

    // Public property 
    this.Name = ""; 
} 

para más - Ver Object Oriented Programming with JavaScript

+0

Dang, simplemente me ganó por 5 segundos –

Cuestiones relacionadas