Las palabras en clave no son fáciles, y los estudiantes útiles esperan prestar atención a mi cuenta pública de WeChat: Programa de vida del código, ¡gracias! El código se utiliza y se recupera por sí mismo.
mapas mentales
1. Promoción variable
Preguntas de entrevista
1. Pregunte el siguiente resultado de salida
if( !("a" in window) ){
var a = 12
}
console.log(a) // undefined
Independientemente de si se establecerán las condiciones para potenciar las variables bajo
var
equivalente global parawindow
configurar una propiedadwindow.a = undefined
. Entonces!("a" in window)
sífalse
, la salida esundefined
2. Pregunte el siguiente resultado de salida
console.log(a)
var a = '林一一'
function fn(){
console.log(a)
var a = 12
}
fn()
console.log(a)
/* 输出
* undefined
* undefined
* 林一一
*/
Con var,function
la actualización debido a las variables, inicialmente a
para la undefined
asignación para el próximo global 林一一
. La función privada con un alcance dentro var
del ascensor también crea variables similares a = undefined
, el siguiente paso es a= 12
. Finalmente, la salida global es林一一
3. Los siguientes resultados de salida
console.log(a)
var a = '林一一'
function fn(){
console.log(a)
a = 12
}
fn()
console.log(a)
/* 输出
* undefined
* 林一一
* 12
*/
No se mejoraron las variables de función interna, la función interna
a
es globala
, y finalmente realizar la funcióna
asignadaa = 12
el resultado de salida es obvio.
4. Busque el siguiente resultado
console.log(a)
a = '林一一'
function fn(){
console.log(a)
a = 12
}
fn()
console.log(a)
/* 输出
* Uncaught ReferenceError: a is not defined
*/
En global a
sin var
, sin actualización de variables. JS buscará el alcance de sus superiores, que no se encuentra window
en ninguna propiedad a
, por lo que se produjo el error de referenciaReferenceError
5. Encuentra la siguiente salida
var a = '林一一'
function fn(){
if(!a){
var a = 12
}
console.log(a)
}
fn()
/* 输出
* 12
*/
Independientemente de si se establece la condición o no, se promoverá la variable
a= undefined
,if(!a) ==> if(!undefined) ==> true
y la salida es 12
6. Encuentra la siguiente salida
var a=12, b = 13, c = 14
function fn(a){
a = 0
var b = 0
c = 0
}
fn(a)
console.log(a)
console.log(b)
console.log(c)
/* 输出
* 12
* 13
* 0
*/
Con el parámetro de función y var
una b
variable privada, por lo que la función a
, b
el mal mundial a
, b
impacto. El resultado es la salida 12
, 13
,0
Dos, cierre JS
Preguntas de entrevista
1. Encuentra la siguiente salida
var ary = [1, 2, 3, 4]
function fn(i){
return function(n){
console.log(n+ (i++))
}
}
var f = fn(10)
f(20) // 30
fn(20)(40) // 60
fn(30)(40) // 70
f(30) // 41
console.log(i) // Uncaught ReferenceError: i is not defined
Este es un problema relativamente simple, es necesario prestar atención a un lugar que
n+ (i++)
es eln
primero y lai
operación dei
nuevo desde más 1,()
no funcionará.
2. Para una pregunta de entrevista de Teng, el siguiente código debe realizar 5 botones de entrada para vincular el evento de clic, clic en un bucle. Una vez que se haya completado la vinculación, haga clic en los cinco botones 1, 2, 3, 4 y 5 para generar 0 , 1, 2 y 3 respectivamente., 4 cinco caracteres
- ¿Se puede realizar el siguiente código?
- No se puede lograr, ¿cuál es el efecto de salida a continuación?
- Cómo modificar para lograr el efecto deseado, explicar el motivo
<div id="btnBox">
<input type="button" value="button_1" />
<input type="button" value="button_2" />
<input type="button" value="button_3" />
<input type="button" value="button_4" />
<input type="button" value="button_5" />
</div>
<script type="text/javascript">
var btnBox = document.getElementById('btnBox'),
input = btnBox.getElementsByTagName('input')
var l = input.length
for(var i =0; i<l; i++){
input[i].onclick = function(){
alter(i);
}
}
</script>
1. No se puede;
2. La salida de resultados es 5, porque el evento es vinculante异步的
cuando la ejecución del evento vinculante, el ciclo externo ha finalizado, la variable utilizadai
es globali
, esta vezi=5
;
3.var
cambio Lalet
razónlet
es que tiene un bloque ámbito de nivel, y cada ámbito de nivel de bloque es privado y no interfiere entre sí. O utilice cierres para resolver o personalizar la resolución de eventos.
Tres, JS esto
Preguntas de entrevista
1.Esto apunta a
var name = '林一一'
var obj = {
name: '林二二',
prop: {
getName: function(){
return this.name
}
}
}
console.log(obj.prop.getName())
var a = obj.prop.getName
console.log(a())
/*
* undefined
* 林一一
/
2. Obtenga el siguiente resultado de salida con el cierre y este
var num = 10 // 60; 65
var obj = {
num: 20
}
obj.fn = (function (num){
this.num = num * 3
num++ // 21
return function(n){
this.num += n // 60 + 5 = 65;20 + 10 =30
num++ // 21 + 1 = 22;22 + 1 = 23
console.log(num)
}
})(obj.num)
var fn = obj.fn
fn(5) // 22
obj.fn(10) // 23
console.log(num, obj.num) // 65, 30
Esta pregunta es un poco más difícil, si está familiarizado con el concepto de alcance superior y este punto, será más fácil. Aquí solo dé una pista, cuanto
return
mayor sea el alcance de la función anónima que se devuelve desde la función se ejecutafn(5)
cuando elthis
punto de ejecuciónwindow
, puntos deobj.fn(10)
ejecución .this
window
Cuatro, constructor JS y cadena de prototipos
Preguntas de entrevista
1. Un prototipo y una pregunta de entrevista en cadena del prototipo para un Teng, envíe el resultado a continuación
function fun(){
this.a = 0
this.b = function(){
alert(this.a)
}
}
fun.prototype = {
b: function(){
this.a = 20
alert(this.a)
},
c: function (){
this.a = 30
alert(this.a)
}
}
var my_fun = new fun()
my_fun.b() // 0
my_fun.c() // 30
my_fun.b()
El alcance de la función en sí que contiene elb
valor de atributo de la salida es 0;my_fun.c()
la función de atributo en sí no lo esc
, se encontrará hacia arriba a través de la cadena del prototipofun.prototype.c
, 30 es la salida.
2. Un prototipo de Teng redirige las preguntas de la entrevista, solicite el siguiente resultado
function Fn(){
var n = 10
this.m = 20
this.aa = function() {
console.log(this.m)
}
}
Fn.prototype.bb = function () {
console.log(this.n)
}
var f1 = new Fn
Fn.prototype = {
aa: function(){
console.log(this.m + 10)
}
}
var f2 = new Fn
console.log(f1.constructor) // ==> function Fn(){...}
console.log(f2.constructor) // ==> Object() { [native code] }
f1.bb() // undefined
f1.aa() // 20
f2.aa() // 20
f2.__proto__.aa() // NaN
f2.bb() // Uncaught TypeError: f2.bb is not a function
f1,f2中本没有 constructor
Sin embargo, el constructorprototype
encontrará equivalente af1.prototype.constructor
,f2
el prototipo fue redefinido a una clase baseobject
;f2.__proto__.aa()
elthis
punto es el prototipoprototype
, el prototipo no tiene atributos ym
, por lo tantothis.m + 10 ==> undefined + 10 ==> NaN
.f2.bb()
Enf2
ningún atributobb
, al__proto__
buscar, y después de que el prototipo es un atributo de prototipo, no redirigirbb
, entonces hasta la clase baseobject
tampoco hay atributosbb
, entoncesf2.bb() ==>undefined()
, el errorTypeError
3. Preguntas de la entrevista de prototipo clásico de una fábrica, solicite el siguiente resultado
function Foo() {
getName = function (){
console.log(1)
}
return this
}
Foo.getName = function () {
console.log(2)
}
Foo.prototype.getName = function(){
console.log(3)
}
var getName = function (){
console.log(4)
}
function getName() {
console.log(5)
}
// 1
Foo.getName()
//2
getName()
//3
Foo().getName();
//4
getName();
//5
new Foo.getName()
//6
new Foo().getName()
//7
new new Foo().getName()
/* 输出
* 2
* 4
* 1
* 1
* 2
* 3
* 3
*/
Esta pregunta es un poco tonta a primera vista, pero después de cada paso del análisis, puede obtener una respuesta precisa. Intento comprender esta pregunta, pero debe tener algunos conocimientos previos, como promoción de variables con el mismo nombre, prototipo y cadena de prototipos, este punto, precedencia del operador, etc.
- En la fase de levantamiento con variable
var
yfunction
se potenciarán las variables, la diferencia entre las dosvar
solo se declara comoundefined
no definir,function
declarar y definir al mismo tiempo. El mismo nombregetName
primero asignará una declaración de función y una definición de dirección de memoria push, que es la salida de laconsole.log(5)
dirección de función anterior , el código JS se ejecuta después degetName
ser reasignado a una nueva dirección de memoria de pilaconsole.log(4)
.Foo.getName()
Es la llamada de la función como el objeto, la salida en 1 es 2; - 2,
getName()
la salida es 4, ya que lagetName()
referencia es la direcciónconsole.log(4)
de; - 3
Foo().getName()
,Foo()
luego de realizar en lagetName
referencia global nuevamente al cambio de direcciónconsole.log(1)
y vuelvethis
al puntowindow
la salida es 1; - 4
getName
está por debajo de la situación general, por lo que la salida naturalmente1
; - 5,
new Foo.getName()
salida de ejecución de función2
; - 6
new Foo().getName() => new A.getName()
, antes denew Foo()
lasA.getName()
llamadas de re-instanciación , pornew Foo()
ejemplo, la llamadagetName()
es al prototipoprototype
, cuya salida es 3; - 7
new new Foo().getName() => new B.getName()
, en primer lugarnew Foo()
instanciado nuevamentenew B.getName()
instanciado,new B.getName()
mientras que también realizaB.getName()
un método oB
método de salida de instancia es el prototipoprototype
degetName
.
Hay un diseño de curso de mini programa WeChat, necesidades de diseño completas, contacto personal QQ: 505417246
Preste atención a la siguiente cuenta pública de WeChat, puede recibir el subprograma de WeChat, Vue, TypeScript, front-end, uni-app, full-stack, Nodejs, Python y otros materiales prácticos de aprendizaje. El
resumen de conocimientos de front-end más reciente y completo y el código fuente del proyecto se lanzará al público de WeChat lo antes posible Número, preste atención, gracias
Después de prestar atención a la cuenta oficial , responda a las preguntas de la entrevista inicial y reciba una gran cantidad de preguntas de la entrevista inicial Resumen de datos en PDF