带有两个函数的JavaScript闭包作用域

带有两个函数的JavaScript闭包作用域,javascript,function,closures,Javascript,Function,Closures,我正在努力解决JavaScrit函数中的闭包范围问题。下面的函数应该创建三个具有不同图像的样例(可以使用),然后单击这些样例时,应该切换样式表 问题在于,即使单步执行显示第一个函数中的theme变量确实发生了变化,但相同的对象仍会传递给switchTheme函数 var switcherConfig = { themes: { 'Orangeness': { folder: 'ui-lightness'

我正在努力解决JavaScrit函数中的闭包范围问题。下面的函数应该创建三个具有不同图像的样例(可以使用),然后单击这些样例时,应该切换样式表

问题在于,即使单步执行显示第一个函数中的
theme
变量确实发生了变化,但相同的对象仍会传递给
switchTheme
函数

var switcherConfig = {
    themes: 
        {
            'Orangeness': {
                folder: 'ui-lightness'
            },
            'Red Matter': {
                folder: 'blitzer'
            },
            'Flubber': {
                folder: 'south-street'
            }
        }
}
function createThemeSwitcher(placeholderSelector) {
    for (var themeName in switcherConfig.themes) {
        var theme = switcherConfig.themes[themeName];
        var anchor = $('<a/>')
            //.text(theme.title)
            .attr('title', theme.title)
            .attr('href', '#')
            .on('click', function () { switchTheme(theme); })
            // append to DOM etc
    }
}
function switchTheme(theme) {
    var themeDirectory = switcherConfig.baseDirectory + '/' + theme.folder + '/';
    // 'theme' variable is always the last in my 'themes' config object
}
var开关配置={
主题:
{
“橙色”:{
文件夹:“ui亮度”
},
“红色物质”:{
文件夹:“blitzer”
},
“Flubber”:{
文件夹:“南街”
}
}
}
函数createThemeSwitcher(占位符选择器){
for(switcherConfig.themes中的变量themeName){
var theme=switcherConfig.themes[themeName];
变量锚=$('')
//.文本(主题.标题)
.attr('title',theme.title)
.attr('href','#')
.on('click',function(){switchTheme(主题);})
//附加到DOM等
}
}
功能切换主题(主题){
var-themeDirectory=switcherConfig.baseDirectory+'/'+theme.folder+'/';
//“theme”变量始终是我的“themes”配置对象中的最后一个
}

调用函数时,
开关主题(主题)
使用的值将是
主题
处于的状态,在创建匿名回调时,该值未绑定。使用闭包绑定该特定值:

.on('click', (function (t) {
    return function () { switchTheme(t); };
})(theme))

switchTheme(theme)
使用的值将是调用函数时
theme
所处的状态,在创建匿名回调时该值不受约束。使用闭包绑定该特定值:

.on('click', (function (t) {
    return function () { switchTheme(t); };
})(theme))
移动

单击函数

function createThemeSwitcher(placeholderSelector) {
    for (var themeName in switcherConfig.themes) {

        var anchor = $('<a/>')
            //.text(theme.title)
            .attr('title', theme.title)
            .attr('href', '#')
            .on('click', function () { 
                         var theme = switcherConfig.themes[themeName];
                         switchTheme(theme); 
            })
            // append to DOM etc
    }
}
函数createThemeSwitcher(占位符选择器){
for(switcherConfig.themes中的变量themeName){
变量锚=$('')
//.文本(主题.标题)
.attr('title',theme.title)
.attr('href','#')
.on('click',函数(){
var theme=switcherConfig.themes[themeName];
切换主题(主题);
})
//附加到DOM等
}
}
移动

var theme = switcherConfig.themes[themeName];
单击函数

function createThemeSwitcher(placeholderSelector) {
    for (var themeName in switcherConfig.themes) {

        var anchor = $('<a/>')
            //.text(theme.title)
            .attr('title', theme.title)
            .attr('href', '#')
            .on('click', function () { 
                         var theme = switcherConfig.themes[themeName];
                         switchTheme(theme); 
            })
            // append to DOM etc
    }
}
函数createThemeSwitcher(占位符选择器){
for(switcherConfig.themes中的变量themeName){
变量锚=$('')
//.文本(主题.标题)
.attr('title',theme.title)
.attr('href','#')
.on('click',函数(){
var theme=switcherConfig.themes[themeName];
切换主题(主题);
})
//附加到DOM等
}
}

您可以使用下面的
.data
来代替闭包(只是一种替代方法):

var开关配置={
主题:
{
“橙色”:{
标题:“橙色”,
文件夹:“ui亮度”
},
“红色物质”:{
标题:“红色物质”,
文件夹:“blitzer”
},
“Flubber”:{
标题:"福伯",,
文件夹:“南街”
}
}
}
函数createThemeSwitcher(占位符选择器){
for(switcherConfig.themes中的变量themeName){
var theme=switcherConfig.themes[themeName];

var anchor=$('

您可以使用
。数据
如下(只是一种替代方法):

var开关配置={
主题:
{
“橙色”:{
标题:“橙色”,
文件夹:“ui亮度”
},
“红色物质”:{
标题:“红色物质”,
文件夹:“blitzer”
},
“Flubber”:{
标题:"福伯",,
文件夹:“南街”
}
}
}
函数createThemeSwitcher(占位符选择器){
for(switcherConfig.themes中的变量themeName){
var theme=switcherConfig.themes[themeName];

变量锚=$(“

theme.title在设置属性title时将失败theme.title在设置属性title时将失败该段代码生成一个匿名函数,该函数接受一个值
t
,并返回一个函数,该函数使用该值调用
switchTheme
。然后您立即调用该匿名函数,并将cur传递给它
theme
的rent值。希望有帮助。是的,我很困惑,但这看起来是正确的。你能解释一下吗?这段代码生成了一个匿名函数,它接受一个值
t
,并返回一个函数,该函数使用该值调用
switchTheme
。然后你立即调用该匿名函数,并将cur传递给它
主题的租金价值
。希望能有所帮助。是的,我很困惑,但这看起来是正确的。你能解释一下吗?