在javascript函数中使变量私有
大家好,我这里有两个javascript函数-在第一个函数中,我必须将变量名从'element'和'property'更改为'celelement'和'cproperty',以避免它们与另一个函数冲突。我想知道是否有任何方法来构造函数,以便它们可以使用相同的变量名?任何建议都将是惊人的!非常感谢 Javascript:在javascript函数中使变量私有,javascript,jquery,Javascript,Jquery,大家好,我这里有两个javascript函数-在第一个函数中,我必须将变量名从'element'和'property'更改为'celelement'和'cproperty',以避免它们与另一个函数冲突。我想知道是否有任何方法来构造函数,以便它们可以使用相同的变量名?任何建议都将是惊人的!非常感谢 Javascript: function colorPickDynamic (startcolor, cp){ var i, j, x,
function colorPickDynamic (startcolor, cp){
var i,
j,
x,
celement = []
cproperty = []
for (x=0, i = 2, j = 3; j <= arguments.length; i+=2, j+=2, x++) {
celement[x]=arguments[i]
cproperty[x]=arguments[j]
}
$(cp).ColorPicker({
color: startcolor,
onShow: function (colpkr) {
$(colpkr).fadeIn(500)
return false
},
onHide: function (colpkr) {
$(colpkr).fadeOut(500)
return false
},
onChange: function (hsb, hex, rgb) {
$(cp + ' div').css('backgroundColor', '#' + hex)
for (x = 0; x < celement.length; x++) {
updateAllCSS(celement[x], cproperty[x], '#' + hex)
}
}
})
}
var cssObject = {}
function updateAllCSS() {
var x,
i,
j,
k,
element = []
property = []
value = []
for (x=0, i = 0, j = 1, k = 2; k <= arguments.length; i+=3, j+=3, k+=3, x++) {
element[x]=arguments[i]
property[x]=arguments[j]
value[x]=arguments[k]
}
//updateThemeCreatorCSS
for (x = 0; x < element.length; x++) {
updateThemeCreatorCSS(element[x], property[x], value[x])
}
//updateOutputCSS
for (x = 0; x < element.length; x++) {
updateOutputCSS(element[x], property[x], value[x])
}
function updateThemeCreatorCSS(element, property, value) {
$('#homeIframe').contents().find(element).css(property, value)
$('#generalIframe').contents().find(element).css(property, value)
$('#formIframe').contents().find(element).css(property, value)
}
function updateOutputCSS(element, property, value) {
if (!cssObject[element]) cssObject[element] = {}
cssObject[element][property] = value
$('#css_output').text('')
for (var element in cssObject) {
$('#css_output').append(element + ' {')
var properties = cssObject[element]
for (var property in properties) {
$('#css_output').append(property + ': ' + properties[property] + ' !important;')
}
$('#css_output').append('} <br />')
}
}
}
函数colorPickDynamic(startcolor,cp){
var i,
J
x,,
加速度=[]
cproperty=[]
对于(x=0,i=2,j=3;j函数中定义的变量仅为函数中定义的变量
这意味着它们不存在于该范围之外
function foo(){
var bar = 'hello';
alert('Inside function: ' + bar);
}
foo();
alert('Outside function: ' + bar);
这将向您发出警告:内部函数:hello
还有一个错误:Uncaught ReferenceError:bar未定义
函数中定义的变量仅为函数中定义的变量
这意味着它们不存在于该范围之外
function foo(){
var bar = 'hello';
alert('Inside function: ' + bar);
}
foo();
alert('Outside function: ' + bar);
这将向您发出警告:内部函数:hello
还有一个错误:uncaughtreferenceerror:bar未定义
阅读本文。它讨论了JS中的私有变量
阅读这篇文章。它讨论了JS中的私有变量
您的应用程序做得很好,只是您忘记了一些逗号,所以它们是全局的。在colorPickDynamic
中:
var i,
j,
x,
celement = [], // <- !!!
cproperty = []; // semicolon optional, but recommended
如果省略逗号,将自动插入分号(因此会出现奇怪的情况),行尾将成为声明语句的结尾。下一行将像往常一样进行解释,它是对非局部变量的赋值。脚本的执行方式如下
var i;
var j;
var x;
celement = [];
cproperty = [];
您的应用程序做得很好,只是您忘记了一些逗号,所以它们是全局的。在colorPickDynamic
中:
var i,
j,
x,
celement = [], // <- !!!
cproperty = []; // semicolon optional, but recommended
如果省略逗号,将自动插入分号(因此会出现奇怪的情况),行尾将成为声明语句的结尾。下一行将像往常一样进行解释,它是对非局部变量的赋值。脚本的执行方式如下
var i;
var j;
var x;
celement = [];
cproperty = [];
是的,它们通常是私人的
这是您的错误:
var i,
j,
x,
element = [] // <-- you forgot the comma!
property = [] // <-- recommend using a semicolon here
当你更习惯使用javascript时,就完全可以这样做了,因为到那时你的大脑会自动检测到缺少的逗号。并且习惯使用分号。有经验的javascript程序员会自动检测到缺少的分号作为可能的错误。是的,它们通常是私有的
这是您的错误:
var i,
j,
x,
element = [] // <-- you forgot the comma!
property = [] // <-- recommend using a semicolon here
当你更习惯使用javascript时,就完全可以这样做了,因为到那时你的大脑会自动检测到缺少的逗号。并习惯使用分号。经验丰富的javascript程序员会自动检测到缺少的分号作为可能的错误。JS具有功能范围。函数可以访问所有输入输出ER函数的作用域,它嵌套在其中,不管其他构造是什么。在某种意义上,每个内部定义的函数都使用外部函数的范围作为基础。但是,把它看作是内部函数的一种范围层蛋糕。
如果引用一个var,JavaScript调用对象将检查函数的本地作用域,然后检查下一个函数,依此类推,直到找到第一个具有该名称的可用函数,直到它进入全局作用域
因此,在内部函数中使用“var”声明将防止更改具有相同名称的外部作用域var
重要提示-所有这些仅与函数的定义位置相关
当人们说“闭包”这个词时,这些继承的作用域才是真正的意思。它是定义作用域上下文(那些层)与函数的绑定
现在这里是闭包通常会混淆的地方:
function buildAFunction(){
var
whichOne = "buildAFunction's var";
return function(){ alert(whichOne); }
}
function anotherFunction(){
var //format I use for adding clarity to comma-separated var decs sometimes.
whichOne = "anotherFunction's var",
builtFunc = buildAFunction();
builtFunc();
}
anotherFunction(); //alerts "buildAFunction's var"
你可以移动一个函数,但它仍然只能访问它定义的地方的可用范围。一开始它可能会让人头疼,但当你学会充分利用它时,这是JavaScript的一个愚蠢而强大的功能。相反,让函数在新的上下文中自动神奇地使用东西,你需要查看“this”关键字,该关键字通常仅在将函数分配给对象的属性时才有用。JS具有函数作用域。函数可以访问其嵌套的外部函数作用域中的所有内容,而不管涉及什么其他构造。从某种意义上说,每个内部定义的函数都使用外部函数“范围”是一个基础,但这种思维方式是一种内在功能的范围层次蛋糕。
如果引用一个var,JavaScript调用对象将检查函数的本地作用域,然后检查下一个函数,依此类推,直到找到第一个具有该名称的可用函数,直到它进入全局作用域
因此,在内部函数中使用“var”声明将防止更改具有相同名称的外部作用域var
重要提示-所有这些仅与函数的定义位置相关
当人们说“闭包”这个词时,这些继承的作用域才是真正的意思。它是定义作用域上下文(那些层)与函数的绑定
现在这里是闭包通常会混淆的地方:
function buildAFunction(){
var
whichOne = "buildAFunction's var";
return function(){ alert(whichOne); }
}
function anotherFunction(){
var //format I use for adding clarity to comma-separated var decs sometimes.
whichOne = "anotherFunction's var",
builtFunc = buildAFunction();
builtFunc();
}
anotherFunction(); //alerts "buildAFunction's var"
你可以移动一个函数,但它仍然只能访问它定义的地方的可用范围。一开始它可能会让人头疼,但当你学会充分利用它时,这是JavaScript的一个愚蠢而强大的功能。相反,让函数在新的上下文中自动神奇地使用东西,你需要查看“this”关键字,该关键字通常仅在将函数分配给对象属性时才有用。+1这就是变量作为全局变量而不是局部变量的原因。只需一个逗号即可更改行为