закрытие во многом как объект. Это инстанцируют каждый раз, когда Вы вызываете функцию.
объем закрытие в JavaScript является лексическим, что означает, что все, что содержится в функции закрытие , принадлежит, имеет доступ к любой переменной, которая находится в нем.
переменная А содержится в закрытие
var foo=1;
или var foo;
, Если внутренняя функция (функция, содержавшая в другой функции), получает доступ к такой переменной, не определяя его в ее собственном объеме с var, это изменяет содержание переменной во внешнем закрытие .
А закрытие переживает время выполнения функции, которая породила его. Если другие функции сделают его из закрытие/объем , в котором они определяются (например, как возвращаемые значения), то они продолжат ссылаться на тот закрытие .
function example(closure) {
// define somevariable to live in the closure of example
var somevariable = 'unchanged';
return {
change_to: function(value) {
somevariable = value;
},
log: function(value) {
console.log('somevariable of closure %s is: %s',
closure, somevariable);
}
}
}
closure_one = example('one');
closure_two = example('two');
closure_one.log();
closure_two.log();
closure_one.change_to('some new value');
closure_one.log();
closure_two.log();
somevariable of closure one is: unchanged
somevariable of closure two is: unchanged
somevariable of closure one is: some new value
somevariable of closure two is: unchanged
] Что-то не так с вашим путем включения. Используйте параметр «/ showIncludes» («Свойства конфигурации / C / C ++ / Advanced / Show Includes» в параметрах проекта IDE), чтобы увидеть, какие заголовки и откуда включаются.
Подробнее см. В этом вопросе:
Вы когда-нибудь собирали проект с предыдущей версией? stdafx.h - это стандартное имя предварительно скомпилированного заголовка для проектов msvc. Если вы построили с VS2008, он мог бы создать предварительно скомпилированный заголовок, и, возможно, VS2010 подбирает его. (Если вы не знакомы, предварительно скомпилированный заголовок - это результат сборки, сгенерированный компилятором, который хранится для ускорения компиляции файлов заголовков при следующей сборке.)
Я бы попробовал очистить, а затем проверить вручную каталог проекта (и каталог вывода сборки, если он находится в неочевидном месте), затем полная сборка. Если бы это не помогло, я бы отключил предварительно скомпилированные заголовки (по крайней мере, временно) в настройках проекта и перестроил.
Попробуйте изменить проект -> свойства -> свойства конфигурации -> общие -> Набор символов на «Использовать многобайтовый набор символов»
После добавления параметра / showincludes я получил следующий результат:
1> Note: including file: c:\testapp\stdafx.h
1> Note: including file: c:\testapp\targetver.h
1> Note: including file: C:\Program Files\Microsoft SDKs\Windows\v7.0A\include\WinSDKVer.h
1> Note: including file: C:\WinDDK\6001.18001\inc\api\SDKDDKVer.h
1> Note: including file: C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h
1> Note: including file: C:\Program Files\Microsoft Visual Studio 10.0\VC\include\crtdefs.h
1> Note: including file: C:\WinDDK\6001.18001\inc\api\sal.h
1> Note: including file: C:\Program Files\Microsoft Visual Studio 10.0\VC\include\vadefs.h
Это имело бы смысл, если по какой-то причине он загружает два файла из пути DDK, а не из каталога VS2010 include, если это на самом деле проблема, как мне сказать ему использовать правильный путь?
Проблема здесь: C:\WinDDK\6001.18001\inc\api\sal.h
sal.h определяет аннотации, которые используются в заголовках CRT... DDK включает свой собственный sal.h, который устарел и не содержит всех аннотаций.
Есть 2 возможных решения: - изменить пути включения так, чтобы "C:\Program Files\Microsoft Visual Studio 10.0\VC\include" находился перед "C:\WinDDK\6001.18001\inc\api"
Я обнаружил, что мой включаемый каталог унаследовал от родительских или проектных значений по умолчанию. Проблема в том, что в VS2010 были удалены глобальные параметры для включения путей. После некоторого поиска я обнаружил, что два файла, содержащие эти настройки (из моей предыдущей установки VS), находятся в следующем каталоге:
C: \ users \ username \ appdata \ local \ microsoft \ msbuild \ v4.0 \
Это два файла:
Отредактируйте переменную IncludePath
Удалите путь DDK, сохраните файл и перезапустил VS2010. Это решило мою проблему для всех новых проектов.
Да, смена users.prop работает, но как странно! Вы не можете изменить этот параметр из меню в Visual Studio и не можете перезаписать его в свойствах проекта. Даже если вы удалите настройку, просто введя $ (IncludePath), он, тем не менее, будет использовать путь по умолчанию к DDK.