Sep 01

Если undefined есть defined …

Очень часто возникает потребность знать, определена переменная . Обычная условие if ( newVar ) {... } подходит, потому переменная также может определена быть и иметь значение null , 0 , false и " " , которые являются ложными . В данной статье описано , как решается эта задача , если применять паттерн защищенного кода.

Если в джаваскрипти определить переменную , но не присвоить ей значение , то в нее ( переменной ) будет значение по умолчанию - undefined . То же будет , если обратиться к неопределенной переменной:

var newVar ;

console.log ( newVar ) / / undefined
console.log ( undefinedVar ) / / undefined

Но если нужно узнать ли переменная , то использовать сравнение с undefined опасно , потому что ему можно присвоить значение :

undefined = " I'm defined " ;

var newVar ;

if ( newVar ! = undefined ) {
console.log ( " Variable is defined and has value : " + newVar )
} Else {
console.log ( " Variable is undefined " ) ;
}

/ / result
/ / Variable is defined and has value : undefined

Обычная условие if ( newVar ) {... } также не подходит , поскольку переменная также может определена быть и значение иметь null , 0 , false и " " , которые являются ложными . Безопасным способом является проверка типа переменной , а не ее значение :

undefined = " I'm defined " ;

var newVar ;

if ( typeof ( newVar ) ! = ' undefined ') {
console.log ( " Variable is defined and has value : " + newVar )
} Else {
console.log ( " Variable is undefined " ) ;
}

/ / result
/ / Variable is undefined

Как будто все окей , но проблема переопределения undefined является следствием того , что в джаваскрипти все выполняется в глобальном контексте. Чтобы защитить свой код , нужно выполнить его песочнице ( sandbox ) , куда не имеют доступа соседские дети (другие скрипты) , или хулиганы из другого района ( XSS ) . В джаваскрипти такой песочницей есть функция , так как только она позволяет делать енкапсуляцию .

( function ( ) {
var myVar = " I'm safe " ;

function myFunc ( ) {
return " I'm secured function " ;
}

console.log ( myVar )
console.log ( myFunc ( )) ;

} ( )) ;

console.log ( myVar )
console.log ( myFunc ( )) ;

/ / result
/ / I'm safe
/ / I'm secured function
/ / undefined
/ / myFunc is not defined

Если в песочнице объявить undefined , которая имеет значение неопределенной переменной ( только о джаваскрипт можно так писать :)) , то никто извне не сможет нам навредить :

undefined = " I'm defined " ;
console.log ( undefined )

( function ( undefined ) {
console.log ( undefined )
} ( )) ;

/ / string
/ / undefined

В приведенном примере используется особенность языка аргумент функции имеет значение undefined , если функцию вызвали без этого аргумента. Мы объявляем анонимную функцию с одним аргументом , идентификатором которого является " undefined ", и сразу вызываем ее без аргументов . поэтому внутри функции является локальная переменная undefined , значение которой является « действительно undefined » .

Все написанное выше одинаково работает и для элементов массивов , для полей объектов. Более того , именно там чаще всего используется проверка на « определенность ».
П.С. Вы интересуетесь современным компасом 3d, в особенности видеоуроками по грамотному его использованию? В настоящее время на mysapr.com о компас 3d вы можете узнать более детально, найти интересную тематическую программу и самоучитель по 3d моделированию! Рекомендуем!


  1. Drawing
     Add karma Subtract karma  error|1
    Цитировать.

    а можно в компасе сделать вот такую 3D модель?

    1

Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.